Android studio中NDK开发(二)——使用CMake引入第三方so库及头文件
一、前言
通常来说,第三方提供的so库以及头文件都没有没有引入jni.h头文件。所以我们在导入第三方so库以及头文件的时候需要手动的将其关联到官方的native-lib库中,关联成功后就可以在native-lib中include进第三方头文件,引进头文件成功后就可以在自定义的JNI接口中对第三方头文件中内容进行调用。
二、准备
- 第三方so库以及头文件
- 创建一个默认的NDKDemo(可按照CMake构建NDKDemo这篇来构建)
- 没有引入jni.h头文件指的是native-lib.cpp中的 “#include<jni.h>”
三、步骤
第三方so库:放在src/main/jniLibs/${ANDROID_ABI}(对应的CPU架构)/你的第三方so库
第三方头文件:放在src/main/cpp/include/你的第三方头文件
注意一下几点:
1)jniLibs、CPU对应的架构文件夹(如上图的armeabi-v7a)、include都是我自己创建的;
2)CPU对应的架构文件夹可以根据自己需要来声明,因为提供给我的第三方so库只支持armeabi-v7a,所以这里我只创建了armeabi-v7a文件夹,通常来说,如果第三方支持什么CPU架构,就创建对应的架构文件夹(armeabi-v7a、arm64-v8a、x86、x84_64),然后把对应的so库放到对应的架构文件夹中;
3)这里的第三方so库以及头文件的存放位置只是我自己的习惯,并不是一定要按我这样放,你可以定义自己的存放路径,但是这个路径你要记住,在后面配置 CMakeLists.txt 中会用到。
修改CMakeLists.txt,关联第三方头文件到native-lib,配置好第三方so库以及头文件导入的路径
注意:因为涉及到公司的内部提供的so库和头文件,所以这里我分别用红字的“第三方库名称”和“第三方头文件”来代替(到时候记得自行替换为自己的so库),望谅解~
配置完以上步骤后,“build” 构建一下工程
(四)创建NDKUtil工具类(用来加载so库以及声明native方法)
注意:getVersion()这个方法是我根据第三方头文件中提供的接口定义的native方法,不是随便起的
上面声明好native方法后,接下来就是对native方法的实现,但不是自己实现,具体的实现已经打包在第三方so里面了,所以我们只需要声明JNI接口,在JNI接口中通过C/C++来调用第三方头文件中的接口即可
注意:这里的对native方法的实现,并不是完全自己实现相应的功能,具体的实现已经打包在第三方so里面了,我们只需要声明JNI接口,在JNI接口中通过C/C++来调用第三方头文件中的接口即可。
前面的步骤都没有问题的话,接下来就只需要在MainActivity中调用自己声明好的native方法即可
点击“Run”一下,就可以在手机上看到效果了
四、总结
关键点在于:将没有实现JNI接口的第三方库以及头文件,通过在CMakeLists.txt中完成相关配置,从而关联到已实现JNI接口的native-lib.cpp中,完成第三方so库以及第三方头文件的导入
调用链:
应用层声明的native方法 —> native-lib.cpp中对应的JNI方法 —> 引入的第三方头文件中的接口 —> 第三方so库或者a库中的具体实现方法
注意:这里所说的关联到已实现JNI接口的native-lib.cpp中,重点是要引入jni.h头文件,不一定是native-lib.cpp文件,也可以在src/main/cpp下新建一个自定义的my-lib.cpp,然后把jni.h头文件引入进来,即#include<“jni.h”>,其实核心就在于把jni.h关联到第三方so库中,而官方的native-lib.cpp或者自定义的my-lib.cpp是两者连接的桥梁,这样才能通过JNI层调用到第三方so库的内容。
五、参考
https://blog.csdn.net/ma598214297/article/details/78387847#2.1 构建支持C%2FC%2B%2B的工程。