Android构建时如何向externalNativeBuild传递变量并在代码中使用
解决Gradle向CMake传递常量并在C++代码中生效的方案
你当前的配置仅完成了将值从Gradle传递到CMake侧的步骤,还需要将CMake接收的变量转为C++编译器可识别的预定义宏,才能在代码中直接调用。
步骤1:确认Gradle侧配置正确
数值类型的常量可以直接按你现有写法传递,如果是字符串类型需要额外加转义双引号,示例如下:
android { defaultConfig { externalNativeBuild { cmake { // 数值类型常量直接传递 arguments "-DTEST=" + rootProject.ext.value // 字符串类型常量需要加转义双引号,避免C++识别为标识符 // arguments "-DTEST_STR=\"${rootProject.ext.strValue}\"" } } } }
如果需要不同产品风味/构建类型传递不同的常量,把arguments配置写到对应productFlavors或buildTypes的externalNativeBuild.cmake块中即可。
步骤2:在CMakeLists.txt中配置预定义宏
推荐使用针对单个库的配置方式,不会污染其他编译目标:
方式1:指定Native库生效(推荐)
假设你的Native库名称为native-lib,在add_library配置之后添加如下代码:
add_library( native-lib SHARED native-lib.cpp) # 将CMake接收的TEST变量转为C++预定义宏 target_compile_definitions(native-lib PRIVATE TEST=${TEST}) # 字符串类型需要额外套一层引号 # target_compile_definitions(native-lib PRIVATE TEST_STR="${TEST_STR}")
方式2:全局生效
如果需要所有编译目标都能访问该宏,可以用全局配置:
add_definitions(-DTEST=${TEST}) # 字符串类型写法 # add_definitions(-DTEST_STR="${TEST_STR}")
步骤3:C++代码中直接使用
配置完成后即可按你预期的方式调用常量:
void foo() { int bla = TEST; // 字符串类型使用示例 // const char* str = TEST_STR; }
排查技巧
如果编译仍报错,可在CMakeLists.txt中加入日志打印,确认CMake是否正确接收到Gradle传递的值:
message(STATUS "接收到的TEST值为:${TEST}")
编译项目后在Gradle构建日志中搜索上述关键词,即可确认传值是否符合预期。
内容的提问来源于stack exchange,提问作者API_1024
相关产品推荐
相关产品推荐

