如何设置环境变量以便NDK中的CMakelists.txt可以访问?

Posted

技术标签:

【中文标题】如何设置环境变量以便NDK中的CMakelists.txt可以访问?【英文标题】:How to set environment variable so that CMakelists.txt from NDK can access? 【发布时间】:2021-11-27 20:59:01 【问题描述】:

在使用 NDK 构建 android 应用程序时,我需要设置一个环境变量,以便我的 NDK 项目中的所有 CMakeLists.txt 文件都可以访问该值。很可能我只需要为这个特定的应用程序设置该值。有什么简单的方法吗?

我尝试过的事情:

我尝试使用 bash 脚本来设置环境,并在 gradle 构建期间在 preBuild 之前运行脚本。我认为脚本已执行,但是未设置 env var,至少无法从 CMakeLists.txt 文件中读取。这是app/build.gradle中的代码:

task runBuildScript(type: Exec) 
    commandLine "bash", "-c", './set-env.sh'



project.afterEvaluate 
    preBuild.dependsOn(runBuildScript)


这几乎是脚本所做的所有事情:

DIR="$BASH_SOURCE[0]"
export SDK_BASE=$( cd "$( dirname "$DIR" )/../../" > /dev/null && pwd )

这就是我计划在我的 CMakeLists.txt 文件中使用该环境变量的方式:

LIST(APPEND CMAKE_MODULE_PATH "$ENVSDK_BASE/build-tools/cmake")
include(sdk_module) # this line will only work if the above command can find the module from the correct location

仅供参考,我在 Mac 上使用 Android Studio 来构建这个应用程序,如果这很重要的话。

【问题讨论】:

Shell 脚本(在您的情况下为set-env.sh)无法修改外壳的环境。参见例如that question. 【参考方案1】:

在使用 NDK 构建 Android 应用时,我需要设置一个环境变量,以便我的 NDK 项目中的所有 CMakeLists.txt 文件都可以访问该值。

那么,你有 Gradle 调用 CMake?

如here所述

如果使用 Gradle 构建,请将参数添加到 android.defaultConfig.externalNativeBuild.cmake.arguments,如 ExternalNativeBuild 文档中所述。如果从命令行构建,请使用 -D 将参数传递给 CMake。

ExternalNativeBuild docs 提到了arguments,但没有太多细节。

不过,您可以在 NDK 示例中的 Gradle 中看到 externalNativeBuild.cmake.arguments 的示例,例如 here:

android 
    compileSdkVersion 29
    ndkVersion '22.1.7171670'

    defaultConfig 
        // ...
        externalNativeBuild 
            cmake 
                arguments '-DANDROID_STL=c++_static'
            
        
    
    // ...
    externalNativeBuild 
        cmake 
            version '3.18.1'
            path 'src/main/cpp/CMakeLists.txt'
        
    

【讨论】:

以上是关于如何设置环境变量以便NDK中的CMakelists.txt可以访问?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 conda 包中设置环境变量,以便在激活包含该包的环境时设置它们?

如何在Windows中设置NDK环境变量?

Android NDK系列-AS使用CmakeLists生成so文件

无法在 android studio 上配置 NDK 路径

Android JNI编译语法总结

Android JNI编译语法总结