为 Gradle 和 AndroidStudio 启用实验性 NDK 插件支持

启用并配置实验性 Gradle 插件以改进 AndroidStudio 的 NDK 支持。检查你是否满足以下要求:

  • Gradle 2.10(本例)
  • Android NDK r10 或更高版本
  • 带有构建工具 v19.0.0 或更高版本的 Android SDK

配置 MyApp / build.gradle 文件

从例如编辑 build.gradle 中的 dependencies.classpath 行

classpath 'com.android.tools.build:gradle:2.1.2'

classpath 'com.android.tools.build:gradle-experimental:0.7.2'

(v0.7.2 是撰写本文时的最新版本。请自行检查最新版本并相应调整你的生产线)

build.gradle 文件看起来应该类似于:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle-experimental:0.7.2'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

配置 MyApp / app / build.gradle 文件

编辑 build.gradle 文件,使其类似于以下示例。你的版本号可能看起来不同。

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion 19
        buildToolsVersion "24.0.1"

        defaultConfig {
            applicationId "com.example.mydomain.myapp"
            minSdkVersion.apiLevel 19
            targetSdkVersion.apiLevel 19
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles.add(file('proguard-android.txt'))
            }
        }
        ndk {
            moduleName "myLib"
            
            /* The following lines are examples of a some optional flags that 
               you may set to configure your build environment
            */ 
            cppFlags.add("-I${file("path/to/my/includes/dir")}".toString())
            cppFlags.add("-std=c++11")
            ldLibs.addAll(['log', 'm'])
            stl = "c++_static"
            abiFilters.add("armeabi-v7a")
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

在继续之前,请同步并检查 Gradle 文件中是否存在错误。

测试插件是否已启用

首先确保你已下载 Android NDK 模块。然后在 AndroidStudio 中创建一个新应用程序并将以下内容添加到 ActivityMain 文件中:

public class MainActivity implements Activity {
    onCreate() {
        // Pregenerated code. Not important here
    }
    static {
        System.loadLibrary("myLib");
    }
    public static native String getString();
}

getString() 部分应突出显示为红色,表示无法找到相应的 JNI 功能。将鼠标悬停在函数调用上,直到出现红色灯泡。单击灯泡并选择 create function JNI_...。这应该在 myApp / app / src / main / jni 目录中使用正确的 JNI 函数调用生成 myLib.c 文件。它看起来应该类似于:

#include <jni.h>

JNIEXPORT jstring JNICALL 
Java_com_example_mydomain_myapp_MainActivity_getString(JNIEnv *env, jobject instance)     
{
    // TODO

    return (*env)->NewStringUTF(env, returnValue);
}

如果它看起来不像这样,那么插件没有正确配置或者没有下载 NDK