1、创建库.so
1 创建一个java接口文件,定义相关的接口函数,使用关键字native
2 创建完成之后使用jdk的工具 javah,命令如下:
javah -classpath . -jni com.aijiao.test.JNIDemo
3 之后会生成一个.h文件,将此.h文件拷贝的对应的库目录下。
如果编译的是dll库,换需要映入其他的两个.h文件(JDK目录的include目录下有一个jni.h的文件,include的win32目录下有个jni_md.h文件)
如果编译的是so库,则不需要这两个.h文件。
之后书写自己的代码,完成编译出库即可
4 以编译so库为例,继续向下
建一个目录,将之前第二步编译出来的.h文件拷贝到当前目录。
书写cpp或者c文件。
书写Android.mk
将以上的文件全部拷贝到项目的jni文件夹中,之后启动cmd,执行ndk-build就会生成对应的库文件。
5 so文件编译出来之后就可以加入到对应的android项目中了。生成的库文件需要放在main文件夹下面的jnilibs文件夹中,如果没有就自己新建一个。
加载so可能会遇到的问题:
1、"nativeLibraryDirectories=[/data/app/com.lukouapp-1/lib/arm64,
/vendor/lib64, /system/lib64]]] couldn’t find “libxxxx.so”需要将.so文件放到对应main下面的jnilibs文件夹中,如果没有就自己新建一个。
2、JNI DETECTED ERROR IN APPLICATION: use of invalid jobject 0xad661534
此错误是因为我们java中
使用的String类型,而在转换生成jni的时候会将其转换为jstring,而在使用C++的时候直接使用的是String或者std::string类型,这两个类型都不是
jstring类型。因此我们需要进行转换,jstring callStr = env->NewStringUTF(“xxxxxx”);