gradle-experimental可以在不用編寫.mk檔案的情況下進行NDK開發。
做NDK開發有件比較麻煩的事情就是Application.mk
和Android.mk
的編寫。而gradle-experimental就是用來解決這個麻煩的。
gradle-experimental是Android Studio的一個實驗性的專案,基於gradle的一個外掛,主要用來自動化NDK的配置實現,無需自己編寫Application.mk
和Android.mk
,對於除錯NDK專案也更加的友好。
環境要求:
- gradle>2.10
- Android NDK r10e
- Build Tools 19.0.0
配置gradle-experimental
- 新增依賴
在專案的主目錄下./build.gradle
替換build tools,使用gradle-experimental
12345678910111213buildscript {repositories {jcenter()}dependencies {classpath "com.android.tools.build:gradle-experimental:0.7.0-alpha4"}}allprojects {repositories {jcenter()}} - 替換外掛
在gradle中不能再使用com.android.application
了,需要使用com.android.model.application
替代。 - 在專案主目錄下的
./app/build.gradle
中更改plugin
apply plugin: “com.android.model.application”
- 配置model{}
123456789101112131415161718192021model {android {compileSdkVersion 23buildToolsVersion "23.0.2"defaultConfig {applicationId "com.jjz"//需要使用.apiLevelminSdkVersion.apiLevel 15targetSdkVersion.apiLevel 23versionCode 1versionName "1.0"}buildTypes {release {minifyEnabled false}}}}
配置NDK
在配置NDK之前需要確認:
- NDK包是否下載
- NDK的環境變數是否配置
以上配置完成之後,在./app/build.gradle
中配置android.ndk
1 2 3 4 5 6 7 8 9 10 11 12 |
model { android { compileSdkVersion 23 buildToolsVersion "23.0.2" ndk{ moduleName "experiment" } } } |
這裡定義的moduleName
就是後面生成的NDK的包名。
原始碼配置
預設情況下,我們在src/main/jni下使用的是c/c++檔案。需要在model.android中指定:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
model { android { compileSdkVersion 23 buildToolsVersion "23.0.2" ndk { moduleName "experiment" } sources { main { jni { source { srcDir "src/main/jni" } } java{ source{ srcDir "src/main/java" } } } } } } |
分別指定了java
原始碼和jni
原始碼的目錄。
NDK程式碼
在java裡面定義一個native
方法,native標識的方法會需要在jni中實現,在java中呼叫。
1 2 3 4 5 6 7 8 |
public class NativeUtil { //載入ndk類庫 static { System.loadLibrary("experiment"); } public static native String firstNative(); } |
出現一個紅色的警告:
可以使用alt+enter
鍵自動生成jni方法:
生成的jni方法
1 2 3 4 5 6 7 8 9 |
**#include ** JNIEXPORT jstring JNICALL Java_com_jjz_NativeUtil_firstNative(JNIEnv *env, jclass type) { // TODO return (*env)->NewStringUTF(env, returnValue); } |
修改jni方法返回的內容
1 2 3 4 |
JNIEXPORT jstring JNICALL Java_com_jjz_NativeUtil_firstNative(JNIEnv **env, jclass type) {* * return (**env)->NewStringUTF(env, "is first native"); } |
執行
開啟Toolbar中的執行配置選單,可以看到:
多出了一個app-native
的選單,可以直接執行。
呼叫NativeUtil.firstNative的方法,會得到jni中寫好的返回值:
is first native
可以看到使用gradle-experimental
開發NDK,不用複雜的配置,自動化native方法,不需要定義.h標頭檔案,對除錯友好。
文中原始碼地址:https://github.com/jjz/android/tree/master/experimental