static { System.loadLibrary("native-lib"); }
public native String stringFromJNI();
同时也会自动创建jni的文件,如果在其他地方想使用jni的话直接照猫画虎复制粘贴再改改就OK了,非常方便。
就在我美滋滋的得意自己的成果时,同组的小伙伴又跟我说 要我把我的内容放到主应用里使用,可主应用并没有使用jni,那就需要单独加咯。
于是信心满满的去百度android studio 添加jni方法,然鹅,百度到的方法都不能得到so文件,自然也无法正确的调用jni了,这个问题整整困扰了两天,我曾一度怀疑是不是本地环境的问题,甚至还把ndk版本升级到最新 还是没什么卵用。这些博客可能都不是自己的原创,从别人那里copy一份直接放到自己的博客里。
废话不多数,直接说怎么干吧
前面的步骤跟其他博客差不多:
1 先建一个JniUtils类,然后编写加载jni的代码
static { System.loadLibrary("myjni"); }
public native String stringFromJNI();
2 build->make project生成.class文件
3 打开terminal,cd app/src/main, javah -d jni -classpath 包名.类名 然后自动在生成jni目录,并在该目录下生成.h文件
4 在src\main\jni\目录内新建一个名称为CMakeLists.txt的文件(该文件名称固定为CMakeLists.txt),内容为
注:为了区别两个地方我特意用了两个名字 :在add library和target link libraries中的myjni必须是一致的,用在
static { System.loadLibrary("native-lib"); }
在add library 中的native-lib.cpp这个必须跟接下来新建的jni文件名一致。
其实我看了系统自动创建的项目中也有这个文件,而且里面代码很多,仔细看的话其实也就是这核心的4段代码,其他都是注释
5 点击IDE菜单File -> Link C++ Project with Gradle
externalNativeBuild { cmake { path 'src/main/jni/CMakeLists.txt' } }
jni的部分基本就完事了,下面就是jni编程
在java文件中添加native代码
static { System.loadLibrary("myjni"); } public native String helloJni();
鼠标点击放到native函数上
会提示Cannot resolve corresponding JNI function Java_com_example_jiang_hellojnitest_MainActivity_helloJni
按Alt + Enter点击Create...
在c文件中自动创建函数
JNIEXPORT jstring JNICALL Java_com_example_jiang_hellojnitest_MainActivity_helloJni(JNIEnv *env, jobject instance) { // TODO return (*env)->NewStringUTF(env, returnValue); }
修改函数实现
在java中用一个TextView显示jni函数的结果
运行即可看到jni函数成功执行
参考文档:https://blog.csdn.net/zahuopuboss/article/details/52804817