五、find_library 命令设置查找函数库
find_library 命令的作用是用于搜索函数库 , 找到的函数库的全路径名称保存到第一个参数变量中 ;
搜索存储 : 搜索指定的预编译库, 并存储该预编译库的路径到变量中, 这里存储到了 log-lib 变量中.
指定库名称 : CMake 的搜索路径默认包含了系统库, 只需要指定想添加的公共 NDK 库的名称即可, 这里指定 log 即可. 不需要指定 log 库的完整路径 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so.
验证存在性 : 在完成编译之前, CMake 会验证该函数库是否存在.
下面的构建脚本作用 : 到预设的目录查找 log 库 , 将找到的路径赋值给 log-lib , 这个路径是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so , 不同的 Android 版本号 和 CPU 架构 需要到对应的目录中查找 , 此处是 29 版本 32 位 ARM 架构的日志库
# 搜索存储 : 搜索指定的预编译库, 并存储该预编译库的路径到变量中, 这里存储到了 log-lib 变量中. # 指定库名称 : CMake 的搜索路径默认包含了系统库, 只需要指定想添加的公共 NDK 库的名称即可, 这里指定 log 即可. # 不需要指定 log 库的完整路径 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so. # 验证存在性 : 在完成编译之前, CMake 会验证该函数库是否存在. # 到预设的目录查找 log 库 , 将找到的路径赋值给 log-lib # 这个路径是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so # 不同的 Android 版本号 和 CPU 架构 需要到对应的目录中查找 , 此处是 29 版本 32 位 ARM 架构的日志库 find_library( # 设置保存函数库路径的变量名称. log-lib # 指定 CMake 想要定位的 NDK 库名称 log )
官方文档地址 : https://cmake.org/cmake/help/latest/command/find_library.html
六、target_link_libraries 命令设置链接函数库
target_link_libraries 命令的作用是为目标函数库添加需要链接的函数库 ;
目标函数库 : 就是在 Java / Kotlin 代码中使用 System.loadLibrary(“native-lib”) 加载的动态库 , 这是整个 C/C++ 代码的调用入口 ;
链接多个函数库 : 指定 CMake 应该连接到目标函数库的若干函数库. 可以链接多个函数库, 如使用的 Android NDK 函数库, 预编译的第三方函数库, 系统库等.
链接函数库命令参数说明 :
参数 1 : 本构建脚本要生成的动态库目 标 参数 2 ~ … : 后面是之前预编译的动态库或静态库 , 或引入的动态库 # 指定 CMake 应该连接到目标函数库的若干函数库. # 可以链接多个函数库, 如使用的 Android NDK 函数库, 预编译的第三方函数库, 系统库等. # 链接函数库 # 参数 1 : 本构建脚本要生成的动态库目 标 # 参数 2 ~ ... : 后面是之前预编译的动态库或静态库 , 或引入的动态库 target_link_libraries( # 指定目标函数库. native-lib # 链接目标库到 NDK 中包含的日志库. ${log-lib} )
官方文档 : https://cmake.org/cmake/help/latest/command/target_link_libraries.html
Kotlin 中的加载动态库 : 与 Java 有些不同 , 这里展示一下 ;
class MainActivity : AppCompatActivity() { /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ external fun stringFromJNI(): String companion object { // Used to load the 'native-lib' library on application startup. init { System.loadLibrary("native-lib") } } }
七、CMakeLists.txt 详细中文注释
下面就是自动生成的 CMake 配置文件 , 我添加中文注释 :
# 指定 CMake 最低版本 cmake_minimum_required(VERSION 3.10.2) # 声明项目并为项目命名. project("cmake") # 创建函数库并为函数库命名. # 函数库类型 : 设置该函数库的类型 ① 静态库 STATIC ② 动态库 SHARED. # 相对路径 : 指定源码路径, 注意是相对路径. # 函数库个数据 : 可以定义多个函数库, CMake 会负责构建这些函数库. # 动态库打包 : Gradle 会自动将动态库打包到 APK 安装包中. add_library( # 参数 1 : 设置生成的动态库名称. native-lib # 参数 2 : 设置生成的函数库类型 : ① 静态库 STATIC ② 动态库 SHARED. SHARED # 参数 3 : 配置要编译的源文件. native-lib.cpp ) # 搜索存储 : 搜索指定的预编译库, 并存储该预编译库的路径到变量中, 这里存储到了 log-lib 变量中. # 指定库名称 : CMake 的搜索路径默认包含了系统库, 只需要指定想添加的公共 NDK 库的名称即可, 这里指定 log 即可. # 不需要指定 log 库的完整路径 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so. # 验证存在性 : 在完成编译之前, CMake 会验证该函数库是否存在. # 到预设的目录查找 log 库 , 将找到的路径赋值给 log-lib # 这个路径是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so # 不同的 Android 版本号 和 CPU 架构 需要到对应的目录中查找 , 此处是 29 版本 32 位 ARM 架构的日志库 find_library( # 设置保存函数库路径的变量名称. log-lib # 指定 CMake 想要定位的 NDK 库名称 log ) # 指定 CMake 应该连接到目标函数库的若干函数库. # 可以链接多个函数库, 如使用的 Android NDK 函数库, 预编译的第三方函数库, 系统库等. # 链接函数库 # 参数 1 : 本构建脚本要生成的动态库目 标 # 参数 2 ~ ... : 后面是之前预编译的动态库或静态库 , 或引入的动态库 target_link_libraries( # 指定目标函数库. native-lib # 链接目标库到 NDK 中包含的日志库. ${log-lib} )