为 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