為 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