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
    在这里插入图片描述

三、步骤

(一)新增文件夹,用来存放要导入的第三方so库以及头文件

Android studio中NDK开发(二)——使用CMake引入第三方so库及头文件_第1张图片
第三方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

修改CMakeLists.txt,关联第三方头文件到native-lib,配置好第三方so库以及头文件导入的路径
Android studio中NDK开发(二)——使用CMake引入第三方so库及头文件_第2张图片
Android studio中NDK开发(二)——使用CMake引入第三方so库及头文件_第3张图片
注意:因为涉及到公司的内部提供的so库和头文件,所以这里我分别用红字的“第三方库名称”和“第三方头文件”来代替(到时候记得自行替换为自己的so库),望谅解~


(三)配置build.gradle(app)

Android studio中NDK开发(二)——使用CMake引入第三方so库及头文件_第4张图片
配置完以上步骤后,“build” 构建一下工程


(四)创建NDKUtil工具类(用来加载so库以及声明native方法)

Android studio中NDK开发(二)——使用CMake引入第三方so库及头文件_第5张图片
注意:getVersion()这个方法是我根据第三方头文件中提供的接口定义的native方法,不是随便起的


(五)修改native-lib.cpp

上面声明好native方法后,接下来就是对native方法的实现,但不是自己实现,具体的实现已经打包在第三方so里面了,所以我们只需要声明JNI接口,在JNI接口中通过C/C++来调用第三方头文件中的接口即可
Android studio中NDK开发(二)——使用CMake引入第三方so库及头文件_第6张图片
注意:这里的对native方法的实现,并不是完全自己实现相应的功能,具体的实现已经打包在第三方so里面了,我们只需要声明JNI接口,在JNI接口中通过C/C++来调用第三方头文件中的接口即可。


(六)修改MainActivity

前面的步骤都没有问题的话,接下来就只需要在MainActivity中调用自己声明好的native方法即可
Android studio中NDK开发(二)——使用CMake引入第三方so库及头文件_第7张图片
点击“Run”一下,就可以在手机上看到效果了
Android studio中NDK开发(二)——使用CMake引入第三方so库及头文件_第8张图片

四、总结

关键点在于:将没有实现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的工程。

如有错误,欢迎指正,虚心学习!

你可能感兴趣的:(Android,NDK)