如何在gradle文件中为android ndk build指定NDK_TOOLCHAIN_VERSION

时间:2014-08-26 14:03:01

标签: android android-ndk gradle

我正在移动我的Android项目,该项目使用ndk-build来使用gradle构建系统,如针对android的新构建工具的示例中所述。在此链接中http://tools.android.com/tech-docs/new-build-system。我看了一下页面底部的gradle-samples-0.11以获得灵感。

所以我设法通过在build.gradle默认配置部分中包含以下代码来配置我需要的所有部分。

ndk {
            moduleName "MyModuleName"
            ldLibs "log"
            cFlags "-std=c++11 -fexceptions"
            stl "gnustl_static"
}

我在原始项目的Application.mk文件中有这一行:   NDK_TOOLCHAIN_VERSION:= 4.9 这是我无法配置的最后一块。

我正在使用NDK修订版10.我需要这个NDK_TOOLCHAIN_VERSION:= 4.9因为我的构建报告错误:(25,11)错误:预期嵌套名称说明符'整数'并且该行的c ++代码如下所示。

using Integer = int16_t;

有人对我如何解决这个问题有所了解吗?

4 个答案:

答案 0 :(得分:5)

我一直试图解决这个问题。但最终编写自定义任务使Android Studio使用Application.mk和Android.mk就像在eclipse中一样。

我的build.gradle看起来像这样

apply plugin: 'com.android.application'

android {

    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 20
        versionCode 1
    }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }

    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
        jni.srcDirs = [] //disable automatic ndk-build call
    }
}

task buildNative(type: Exec) {
    def ndkBuild = null;
    def ndkBuildingDir = new File("src/main/jni");
    def hasNdk = false;
    if (System.getenv("NDK_BUILD_CMD") != null) {
        hasNdk = true;
        ndkBuild = new File(System.getenv("NDK_BUILD_CMD"))
    }

    commandLine ndkBuild, "--directory", ndkBuildingDir

    doFirst {
        if (!hasNdk) {
            logger.error('##################')
            logger.error("NDK build failed!!")
            logger.error('Reason: NDK_BUILD_CMD not set.')
            logger.error('##################')
        }
        assert hasNdk: "NDK_BUILD_CMD not set."
    }
}
tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn buildNative }

task cleanNative(type: Exec) {
    def ndkBuild = null;
    def ndkBuildingDir = new File("src/main/jni");
    def hasNdk = false;

    if (System.getenv("NDK_BUILD_CMD") != null) {
        hasNdk = true;
        ndkBuild = new File(System.getenv("NDK_BUILD_CMD"))
    }

    commandLine ndkBuild, "--directory", ndkBuildingDir, "clean"

    doFirst {
        if (!hasNdk) {
            logger.error('##################')
            logger.error("NDK build failed!!")
            logger.error('Reason: NDK_BUILD_CMD not set.')
            logger.error('##################')
        }
        assert hasNdk: "NDK_BUILD_CMD not set."
    }
}
clean.dependsOn 'cleanNative'

为此,您需要设置一个环境变量NDK_BUILD_CMD来设置确切的ndk-build可执行文件。

在Windows上,您只需将环境变量NDK_BUILD_CMD指向您的ndk-build.exe即可

在Mac上,您在.bash_profile中设置的路径变量无法在GUI应用程序上访问(因此Android Studio将无法读取它们)。 因此,请将.bash_profile编辑为

GRADLE_HOME={path_to_gradle}
ANDROID_SDK_ROOT={path_to_sdk_dir}
ANDROID_HOME=$ANDROID_SDK_ROOT/platform-tools
ANDROID_NDK_HOME={path_to_ndk}
NDK_BUILD_CMD=$ANDROID_NDK_HOME/ndk-build 

export PATH=$GRADLE_HOME/bin:$ANDROID_HOME:$ANDROID_SDK_ROOT/tools:$ANDROID_NDK_HOME:/opt/local/bin:/opt/local/sbin:$PATH

launchctl setenv GRADLE_HOME $GRADLE_HOME
launchctl setenv ANDROID_HOME $ANDROID_HOME
launchctl setenv ANDROID_NDK_HOME $ANDROID_NDK_HOME
launchctl setenv NDK_BUILD_CMD $NDK_BUILD_CMD

launchctl行将使您的环境变量在Android Studio中可见。 PS:每次打开终端时都会运行.bash_profile。因此,要使其与Android Studio一起正常运行,您需要启动一次终端,然后运行Android Studio。否则,构建将失败,表示未设置NDK_BUILD_CMD。当Mac启动时,我还没有找到任何设置值的方法。如果其他人可以找到方法,请随时提出建议。

答案 1 :(得分:3)

我刚刚遇到这个问题,但我的解决方案实际上是你最初的问题。最新版本的NDK默认使用GCC 4.9(https://developer.android.com/tools/sdk/ndk/index.html)。这只是在64位机器上的默认设置。因此,您不再需要在build.gradle文件中设置NDK_TOOLCHAIN_VERSION属性。所以只需设置:

cFlags "-std=c++11 -fexceptions"
stl "gnustl_static"

在ndk {}应该就够了。适合我。

答案 2 :(得分:1)

在最新版本的Android Studio 1.5和Gradle 2.10以及实验插件0.7.0-alpha4中,您可以像这个示例一样指定它使用版本3.6的Clang工具链。

ndk {
                moduleName "MyModuleName"
                ldLibs "log"
                cFlags "-std=c++11 -fexceptions"
                stl "gnustl_static"
                toolchain "clang"
                toolchainVersion = "3.6" 
}

您可以参考NDK目录以了解哪些工具链和哪些版本可用 对于NDK r10e,可提供GCC(4.8,4.9)和Clang(3.5,3.6)选项。如果您没有指定工具链,它将默认使用GCC 4.9。

请参阅LINK以了解有关应用程序gradle配置的更多信息。

答案 3 :(得分:0)

尽管很久以前就问过这个问题, (https://developer.android.com/studio/projects/install-ndk)中所述的适当解决方案: 如果要安装NDK的特定版本,并希望在模块中使用它,则可以使用模块的build.gradle文件中的android.ndkVersion属性指定它,如以下代码示例所示。

android {
    ndkVersion "major.minor.build"
}