CMake 参数传递
打包编译指令参数 -> gradle 参数 -> CMakeList 参数 -> 编译C++
- 打包编译指令参数
比如:make project时会以一些默认的参数区编译C++文件,这些是IDE设定的 - gradle 参数
这里我们可以在 Module 两个地方增加参数
android {
defaultConfig {
externalNativeBuild {
cmake {
// 1. 可以指定很多参数,用逗号隔开,参数以`-D`开头
// 2. 这里定义的,共用于所有渠道 Flavors
arguments "-DTest_Params1=okokokok"
}
}
}
flavorDimensions "engineType"
productFlavors {
cpu {
dimension "engineType"
externalNativeBuild {
cmake {
// 在 defaultConfig 的基础上增加渠道的参数
arguments "-DTest_Params=cpu"
}
}
}
npu {
dimension "engineType"
externalNativeBuild {
cmake {
arguments "-DTest_Params=npu"
}
}
}
}
}
CMakeList 参数
目前我用到的是控制C++的宏add_definitions(-DCPU)
和add_definitions(-DNPU)
通过获取build.gradle
的参数来决定打开CPU
或者NPU
的宏编译C++
编译时,解析 CMakeList 中定义的宏
cmake_minimum_required(VERSION 3.4.1)
# 打印消息,在 build output 中可以查看
message(STATUS "print cmake params: =============== start ")
# 打印所有参数
get_cmake_property(_variableNames VARIABLES)
list (SORT _variableNames)
foreach (_variableName ${_variableNames})
message(STATUS "params: ${_variableName}=${${_variableName}}")
endforeach()
message(STATUS "print cmake params: =============== end")
# 通过参数来控制要打开哪个宏
if("${Test_Params}" STREQUAL "cpu")
message(STATUS "get params = cpu")
add_definitions(-DCPU)
else()
message(STATUS "get params = npu")
add_definitions(-DNPU)
endif()
# ...
开始编译
-
左下角选中编译渠道
- Make 模块或者整个项目
- 然后在C++所在模块的build目录下找到 build output 文件查看参数打印
print cmake params: =============== start
...
params: Test_Params=cpu // 渠道里定义的参数
params: Test_Params1=okokokok // defaultconfig 定义的参数
..
print cmake params: =============== end
C/C++里使用宏
#ifdef NPU
__android_log_print(ANDROID_LOG_DEBUG, "JNI", "testMethod: NPU");
#endif
#ifdef CPU
__android_log_print(ANDROID_LOG_DEBUG, "JNI", "testMethod: CPU");
#endif
如果是CPU的渠道,会打印CPU,反之,会打印NPU
注意
- defaultConfig 定义的参数会被 Flavors 里面的覆盖
- Flavors 的参数,谁先定义为主,不存在覆盖,所以Flavors中相同的dimension尽量不要定义相同的参数,不然很容易忽略先后顺序
- productFlavors 的先后顺序是以
flavorDimensions "modelType", "engineType"
定义的顺序为准