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库以及头文件

第三方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库以及头文件导入的路径

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

注意:因为涉及到公司的内部提供的so库和头文件,所以这里我分别用红字的“第三方库名称”和“第三方头文件”来代替(到时候记得自行替换为自己的so库),望谅解~

(三)配置build.gradle(app)

å¨è¿éæå¥å¾çæè¿°

配置完以上步骤后,“build” 构建一下工程

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

å¨è¿éæå¥å¾çæè¿°

注意:getVersion()这个方法是我根据第三方头文件中提供的接口定义的native方法,不是随便起的

(五)修改native-lib.cpp
上面声明好native方法后,接下来就是对native方法的实现,但不是自己实现,具体的实现已经打包在第三方so里面了,所以我们只需要声明JNI接口,在JNI接口中通过C/C++来调用第三方头文件中的接口即可

å¨è¿éæå¥å¾çæè¿°

注意:这里的对native方法的实现,并不是完全自己实现相应的功能,具体的实现已经打包在第三方so里面了,我们只需要声明JNI接口,在JNI接口中通过C/C++来调用第三方头文件中的接口即可。

å¨è¿éæå¥å¾çæè¿°

(六)修改MainActivity
前面的步骤都没有问题的话,接下来就只需要在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的工程。


如有错误,欢迎指正,虚心学习!
————————————————
版权声明:本文为CSDN博主「Xiongjiayo」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Xiongjiayo/article/details/85340121

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio 使用 Gradle 构建工具进行编译和打包,生成 .so 动态链接,可以按照以下步骤进行: 1. 在 Android Studio 创建一个 C/C++ 模块,选择 File -> New -> New Module -> C/C++ Library,然后按照向导设置模块名称、语言类型和支持的 ABI。 2. 在模块的 build.gradle 文件,添加以下配置: ```groovy android { // 指定支持的 ABI,包括 armeabi-v7a、arm64-v8a、x86、x86_64 等 ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } // 配置 CMakeLists.txt 文件路径 externalNativeBuild { cmake { path "CMakeLists.txt" } } } // 配置 CMake 版本 cmake { version "3.10.2" } ``` 3. 在模块的 src/main 目录下创建 jni 文件夹,并将 C/C++ 代码放入该文件。 4. 在 jni 文件夹下创建 CMakeLists.txt 文件,并编写编译选项和链接选项,指定生成 .so 文件的名称和路径,以及引入其他依赖等。例如: ```cmake # 设置编译选项 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") # 设置源文件路径 file(GLOB_RECURSE SOURCE_FILES "*.cpp") # 设置文件路径 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) # 配置动态输出路径和名称 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}) set(CMAKE_LIBRARY_OUTPUT_NAME "native-lib") # 引入其他依赖 find_library(log-lib log) # 生成动态 add_library(native-lib SHARED ${SOURCE_FILES}) target_link_libraries(native-lib ${log-lib}) ``` 5. 点击 Android Studio 工具栏的 Build -> Make Project,进行编译和打包,生成 .so 动态链接。 6. 在模块的 build.gradle 文件查看生成的 .so 文件路径,例如: ```groovy android { externalNativeBuild { cmake { path "CMakeLists.txt" } } sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } } ``` 以上就是在 Android Studio 使用 Gradle 构建工具进行编译和打包,生成 .so 动态链接的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值