You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:06:03