為 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