android - 如何在 android ndk 构建的 gradle 文件中指定 NDK_TOOLCHAIN_VERSION

标签 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 这是我无法配置的最后一 block 。

我正在使用 NDK 修订版 10。我需要这个 NDK_TOOLCHAIN_VERSION:=4.9,因为我的构建报告错误:(25, 11) 错误:'Integer' 之前的预期嵌套名称说明符和该行的 c++ 代码看起来像这个。

using Integer = int16_t;

请问有人知道我该如何解决这个问题吗?

最佳答案

我也一直在努力解决这个问题。但最终通过编写自定义任务让 Android Studio 像在 eclipse 中一样使用 Application.mk 和 Android.mk。

我的 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 not set。我还没有找到任何方法来设置 Mac 启动时的值。如果其他人可以找到方法,请随时提出建议。

关于android - 如何在 android ndk 构建的 gradle 文件中指定 NDK_TOOLCHAIN_VERSION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25507780/

相关文章:

Android:多个警报不起作用

Android Studio NDK 构建问题 Error :Execution failed for task ':app:buildNative'

java - 从个人部门迁移到对齐规则

android - Android无法找到com.android.support

java - Android getInputStream 无法正常工作

android - Sqlite 数据库中的 ID 冲突?

java - 在编译时未评估的接口(interface)中定义的最终静态字符串 - Android

android - 从 Android 将 ArrayList 发布到 php 服务器

android - Fabric Crashlytics NDK 堆栈回溯丢失的帧

android - 程序类型已经存在:com.flurry.android.Consent