一、Android NDK 构建脚本

Android 中使用 NDK 编译 C/C++ 源码有两种方式 , 参考 Android 官网:https://developer.android.google.cn/ndk/guides

方式一 :

使用 ndk-build 脚本 , 包括 Android.mk 和 Application.mk 两个脚本 , 详细的细节参考如下链接

老的 Android 开发环境使用的是这种方式编译 C/C++ 源码 ;

方式二 :

使用 CMake 构建脚本 CMakeLists.txt 编译 C/C++ 源码 , 参考如下链接

这是目前 Google 官方推荐的方式

二、CMake 构建脚本示例

下面的构建脚本中用到了很多命令 , 如

  • cmake_minimum_required
  • add_library
  • set_target_properties
  • message
  • find_library
  • set
  • target_link_libraries

上述命令都是 CMake 命令 , 可以在 CMake 命令文档中查询 , 当前 CMake 中有 50 个脚本命令 , 46 个工程命令 ;

CMake 构建脚本示例 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# 指定 CMake 最低版本
cmake_minimum_required(VERSION 3.4.1)

# 设置函数库编译
add_library( # 参数 1 : 设置生成的动态库名称
native-lib

# 参数 2 : 设置生成的函数库类型 : ① 静态库 STATIC ② 动态库 SHARED
SHARED

# 参数 3 : 配置要编译的源文件
native-lib.cpp)


# 引入静态库
# ① 参数 1 ( add ) : 设置引入的静态库名称
# ② 参数 2 ( SHARED ) : 设置引入的函数库类型 : ① 静态库 STATIC ② 动态库 SHARED
# ③ 参数 3 ( IMPORTED ) : 表示引入第三方静态库 , 导入静态库 , 相当于预编译静态库
# 后续还需要设置导入路径 , 配合该配置使用
add_library(
# 设置引入的静态库名称
add

# 设置引入的函数库类型为静态库
STATIC

# 表示引入第三方静态库
IMPORTED)

# 设置上述静态库的导入路径
# 设置目标属性参数 :
# ① 参数 1 ( add ) : 要设置哪个函数库的属性
# ② 参数 2 ( PROPERTIES ) : 设置目标属性
# ③ 参数 3 ( IMPORTED_LOCATION ) : 设置导入路径
# ④ 参数 4 : 配置静态库的文件路径
set_target_properties(
# 设置目标
add

# 设置属性
PROPERTIES

# 导入路径
IMPORTED_LOCATION

# ${CMAKE_SOURCE_DIR} 是本 CMakeList.txt 构建脚本的路径 , 是 CMake 工具内置的变量
# Android CMake 也内置了一些变量 , 如 ANDROID_ABI
${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a/libadd.a)

# 打印日志信息
# ${ANDROID_ABI} 的作用是获取当前的 CPU 指令集架构
# 当本次编译 armeabi-v7a CPU 架构时 , ${ANDROID_ABI} 值为 armeabi-v7a
# 当本次编译 x86 CPU 架构时 , ${ANDROID_ABI} 值为 x86
message("CMAKE_SOURCE_DIR : ${CMAKE_SOURCE_DIR}, ANDROID_ABI : ${ANDROID_ABI}")


# 到预设的目录查找 log 库 , 将找到的路径赋值给 log-lib
# 这个路径是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so
# 不同的 Android 版本号 和 CPU 架构 需要到对应的目录中查找 , 此处是 29 版本 32 位 ARM 架构的日志库
find_library(
log-lib

log)


# 设置变量
# CMAKE_CXX_FLAGS 表示会将 C++ 的参数传给编译器
# CMAKE_C_FLAGS 表示会将 C 参数传给编译器

# 参数设置 : 传递 CMAKE_CXX_FLAGS C+= 参数给编译器时 , 在 该参数后面指定库的路径
# CMAKE_SOURCE_DIR 指的是当前的文件地址
# -L 参数指定动态库的查找路径
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a")

# 链接函数库
# 参数 1 : 本构建脚本要生成的动态库目 标
# 参数 2 ~ ... : 后面是之前预编译的动态库或静态库 , 或引入的动态库
target_link_libraries(
native-lib

# 表示 编译 native-lib 模块, 要链接 add 模块
add

${log-lib})

从之前的一篇博客 【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 ) 复制来的 ;

三、CMake 命令手册

CMake 命令分为三种:脚本命令, 工程命令, CTest 命令

1、CMake 脚本命令

CMake 有 50 个脚本命令 , 这些命令在任何时候都可以使用 , 参考 cmake-commands(7) : Scripting Commands 文档

50 个脚本命令如下 :

  • block
  • break
  • cmake_host_system_information
  • cmake_language
  • cmake_minimum_required
  • cmake_parse_arguments
  • cmake_path
  • cmake_policy
  • configure_file
  • continue
  • else
  • elseif
  • endblock
  • endforeach
  • endfunction
  • endif
  • endmacro
  • endwhile
  • execute_process
  • file
  • find_file
  • find_library
  • find_package
  • find_path
  • find_program
  • foreach
  • function
  • get_cmake_property
  • get_directory_property
  • get_filename_component
  • get_property
  • if
  • include
  • include_guard
  • list
  • macro
  • mark_as_advanced
  • math
  • message
  • option
  • return
  • separate_arguments
  • set
  • set_directory_properties
  • set_property
  • site_name
  • string
  • unset
  • variable_watch
  • while

2、CMake 工程命令

CMake 中有 46 个工程命令 , 一般在 CMake 工程中才可以使用上述工程命令 ;

46 个工程命令如下 , 详细的命令细节参考 cmake-commands(7) : Project Commands 文档

  • add_compile_definitions
  • add_compile_options
  • add_custom_command
  • add_custom_target
  • add_definitions
  • add_dependencies
  • add_executable
  • add_library
  • add_link_options
  • add_subdirectory
  • add_test
  • aux_source_directory
  • build_command
  • create_test_sourcelist
  • define_property
  • enable_language
  • enable_testing
  • export
  • fltk_wrap_ui
  • get_source_file_property
  • get_target_property
  • get_test_property
  • include_directories
  • include_external_msproject
  • include_regular_expression
  • install
  • link_directories
  • link_libraries
  • load_cache
  • project
  • remove_definitions
  • set_source_files_properties
  • set_target_properties
  • set_tests_properties
  • source_group
  • target_compile_definitions
  • target_compile_features
  • target_compile_options
  • target_include_directories
  • target_link_directories
  • target_link_libraries
  • target_link_options
  • target_precompile_headers
  • target_sources
  • try_compile
  • try_run

3、CTest 工程命令

13 个测试命令如下 , 详细的命令细节参考 cmake-commands(7) : CTest Commands 文档

  • ctest_build
  • ctest_configure
  • ctest_coverage
  • ctest_empty_binary_directory
  • ctest_memcheck
  • ctest_read_custom_files
  • ctest_run_script
  • ctest_sleep
  • ctest_start
  • ctest_submit
  • ctest_test
  • ctest_update
  • ctest_upload

在 Android Studio 中的 CMake 构建脚本 CMakeLists.txt 中使用到的所有 CMake 命令都来自上述脚本命令和工程命令 , 如 add_library , find_library , target_link_libraries 等 ;

Android Studio 中的 CMakeLists.txt 构建脚本中常用的命令 :

  • cmake_minimum_required
  • add_library
  • set_target_properties
  • message
  • find_library
  • set
  • target_link_libraries

参考链接:https://blog.csdn.net/shulianghan/article/details/111866146