如何设置环境变量让NDK项目的CMakeLists.txt可正常访问?
失效原因说明
你之前的配置无法生效是因为Exec任务启动的是独立子Shell进程,子进程内export的环境变量仅在当前子进程生命周期内有效,无法传递给Gradle主进程,后续启动的CMake构建进程自然读取不到对应变量。
推荐方案:Gradle注入CMake环境变量(无需修改现有CMake逻辑)
这个方案不需要改动你已有的CMake读取环境变量的代码,仅需修改app/build.gradle配置即可实现需求:
- 先在
app/build.gradle顶部执行你的环境变量脚本,读取到SDK_BASE的值:
// 读取set-env.sh中定义的SDK_BASE值 def sdkBaseOutput = new ByteArrayOutputStream() exec { commandLine "bash", "-c", "source ./set-env.sh && echo \$SDK_BASE" standardOutput = sdkBaseOutput } def SDK_BASE = sdkBaseOutput.toString().trim()
- 在
android.defaultConfig块的CMake配置中注入环境变量:
android { namespace "你的应用包名" compileSdk 你的编译版本 defaultConfig { // 你原有的defaultConfig配置保持不变 externalNativeBuild { cmake { // 注入SDK_BASE到CMake运行时环境变量 environment "SDK_BASE", SDK_BASE // 你原有的其他CMake配置(比如cppFlags、arguments等)保持不变 } } } // 你原有的其他配置(比如buildTypes、externalNativeBuild的CMake路径配置等)保持不变 }
配置完成后重新同步Gradle、构建项目,你的所有CMakeLists.txt中读取$ENV{SDK_BASE}的逻辑都可以正常运行。
可选方案:直接传递CMake变量(可修改CMake代码时选用)
如果可以调整CMake代码,也可以直接通过Gradle给CMake传递变量,减少环境变量依赖:
- Gradle配置改为传参数:
android { defaultConfig { externalNativeBuild { cmake { arguments "-DSDK_BASE=${SDK_BASE}" } } } }
- CMake中直接使用变量:
LIST(APPEND CMAKE_MODULE_PATH "${SDK_BASE}/build-tools/cmake") include(sdk_module)
验证方式
可以在CMakeLists.txt中添加调试打印语句,构建后在Build窗口查看输出确认变量是否正确:
message(STATUS "读取到的SDK_BASE值为:$ENV{SDK_BASE}")
内容的提问来源于stack exchange,提问作者odieatla
相关产品推荐
相关产品推荐

