【CMake】Android Studio 中使用 CMake 编译单个 C++ 源文件 ( 常用的 CMake 命令解析 )(二)

简介: 【CMake】Android Studio 中使用 CMake 编译单个 C++ 源文件 ( 常用的 CMake 命令解析 )(二)

五、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} )




目录
相关文章
|
SQL 人工智能 Dart
Android Studio的插件生态非常丰富
Android Studio的插件生态非常丰富
956 1
|
Ubuntu Linux Android开发
Android Studio支持多种操作系统
Android Studio支持多种操作系统
754 1
|
开发工具 Android开发 iOS开发
如何在Android Studio中配置Flutter环境?
如何在Android Studio中配置Flutter环境?
2833 160
|
11月前
|
Android开发 Windows
Android studio 报错Connect to 127.0.0.1:8888 [/127.0.0.1] failed: Connection refused: connect(已解决)
这是一篇关于解决Android Studio报错“Connect to 127.0.0.1:8888 failed: Connection refused”的文章。问题通常因系统代理设置被Android Studio自动保存导致。解决方法是找到系统中Android Studio使用的gradle.properties文件(位于Windows的C:\Users\你的电脑用户名\.gradle或Mac的/Users/.{你的用户目录}/.gradle),删除或注释掉多余的代理配置后保存并重新Sync项目。希望此经验能帮助快速解决同类问题!
2232 36
|
11月前
|
Java Android开发
Android studio中build.gradle文件简单介绍
本文解析了Android项目中build.gradle文件的作用,包括jcenter仓库配置、模块类型定义、包名设置及依赖管理,涵盖本地、库和远程依赖的区别。
953 19
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
516 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
465 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
680 8
|
数据可视化 开发工具 Android开发
Android Studio
Android Studio
925 1

推荐镜像

更多
  • DNS