zoukankan      html  css  js  c++  java
  • ndk学习17: jni之Java调用C&C++


    一.Hello World
    1. 定义函数原型

    native关键字定义的函数即为jni函数


    2.生成头文件

    切换到src目录执行: (这个过程可以写脚本自动完成,比如自动拷贝到jni目录)
    javah -jni 包名.类名

    在根目录下生成:
    org_bing_testjni_MainActivity.h


    3. 工程中添加jni代码
    工程右键->添加native code->输入名字->finish

    多了如下文


    新建一个Application.mk,配置相关选项(详细查看ndk有关Application的说明)
    APP_ABI := x86
    APP_PLATFORM := android-14
    APP_STL := stlport_static
    APP_CPPFLAGS += -fexceptions
    APP_CPPFLAGS += -frtti 

    同时把刚刚生成的.h文件拷贝到jni目录


    4. 实现native函数
    函数的声明已经在头文件生成了


    在CPP实现上述函数:
    #include "org_bing_testjni_MainActivity.h"
    #include <stdio.h>
    #include <string>
    using namespace std;
    jstring JNICALL Java_org_bing_testjni_MainActivity_sayHello
    (JNIEnvenvjobject objjstring name)
    {
        const charpname = env->GetStringUTFChars(nameNULL);
        string str_info = "Hello World:";
        str_info += pname;
        jstring ret_str = env->NewStringUTF(str_info.c_str());
        // C文件使用(*env)->Fun(env,xxx,...)的方式传递
        // (*env)->NewStringUTF(env, "Hello World");
        return ret_str;
    }
    JNIEXPORT jint JNICALL Java_org_bing_testjni_MainActivity_Add
      (JNIEnv *envjobject objjint ajint b)
    {
        return a + b;
    }

    编译在libs目录生成libTestJni.so,打包APK会自动将上述函数打包到APK

    5. 在Java中使用
    loadLibrary
    static
    {
        System.loadLibrary("TestJni");
    }  

    然后直接调用即可:
    Log.d("__BING__", sayHello("bing"));
    Log.d("__BING__""5 + 3=" + Add(5,3));  

    运行效果:




























  • 相关阅读:
    2017.3.10组合数学学习——多重集合的排列、组合,有限概率
    poj 3169 Layout
    poj 1201 Intervals
    poj 1716 Integer Intervals
    2017.3.9 组合数学学习——组合、多重集排列
    [HNOI 2013]切糕
    思维相似处总结(未完待续)
    bzoj 3673: 可持久化并查集 by zky
    SDOI2013 森林
    标题还没想好
  • 原文地址:https://www.cnblogs.com/bingghost/p/5754685.html
Copyright © 2011-2022 走看看