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

如何设置环境变量让NDK项目的CMakeLists.txt可正常访问?

失效原因说明

你之前的配置无法生效是因为Exec任务启动的是独立子Shell进程,子进程内export的环境变量仅在当前子进程生命周期内有效,无法传递给Gradle主进程,后续启动的CMake构建进程自然读取不到对应变量。


推荐方案:Gradle注入CMake环境变量(无需修改现有CMake逻辑)

这个方案不需要改动你已有的CMake读取环境变量的代码,仅需修改app/build.gradle配置即可实现需求:

  1. 先在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()
  1. 在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传递变量,减少环境变量依赖:

  1. Gradle配置改为传参数:
android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DSDK_BASE=${SDK_BASE}"
            }
        }
    }
}
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:15:03