Android Studio使用新的Gradle構建工具配置NDK環境

安卓弟的專欄發表於2015-09-17

從Android Studio 1.3 Beta1開始,就支援了NDK。不過使用的是一個全新的實驗性的gradle構建工具。官方地址 http://tools.android.com/tech-docs/new-build-system/gradle-experimental ,英文好的可以直接看原文。

在進行配置前請先將Android Studio更新至最新版本,目前最新版本是1.4 Bata4

Android Studio使用新的Gradle構建工具配置NDK環境

並且使用Android Studio內建的SDK管理器下載NDK。

Android Studio使用新的Gradle構建工具配置NDK環境

或者在專案上右鍵開啟Project Structure,切到的SDK Location頁進行安裝

Android Studio使用新的Gradle構建工具配置NDK環境

注意這個NDK安裝好後其目錄在SDK目錄下的ndk-bundle目錄下,與以往的不同。

要修改的檔案見下圖

Android Studio使用新的Gradle構建工具配置NDK環境

首先需要將根目錄下的gradle修改為實驗性的gradle

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

最終是這樣的

Android Studio使用新的Gradle構建工具配置NDK環境

並且需要gradle 2.5的支援,將gradle/gradle-wrapper.properties中的版本修改為2.5

distributionUrl=https/://services.gradle.org/distributions/gradle-2.5-all.zip

最終是這樣的

Android Studio使用新的Gradle構建工具配置NDK環境

然後修改原來的app/build.gradle,注意現在各項配置都是有等號的,並且使用的是 com.android.model.application而不再是原來的com.android.application,如果是Library,則 是com.android.model.library。然後android外圍包了一層model。原來在android裡面的buildTypes 移到了外面。等等,看下面內容,注意變化。

apply plugin: 'com.android.model.application'
model{
  android {
    compileSdkVersion = 22
    buildToolsVersion = "23.0.1"
    defaultConfig.with {
      applicationId = "com.kltz88.car.jnidemo"
      minSdkVersion.apiLevel = 14
      targetSdkVersion.apiLevel = 22
      versionCode = 1
      versionName = "1.0"
    }
    tasks.withType(JavaCompile) {
        //指定編譯JDK版本
      sourceCompatibility = JavaVersion.VERSION_1_7
      targetCompatibility = JavaVersion.VERSION_1_7
    }
  }
  android.ndk {
    moduleName = "test"
    ldLibs +="log"
    abiFilters +="armeabi"
    abiFilters +="armeabi-v7a"
    abiFilters +="x86"
  }
  android.buildTypes {
    release {
      minifyEnabled = false
      proguardFiles += file( 'proguard-rules.pro')
    }
  }
}
dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  compile 'com.android.support:appcompat-v7:22.2.1'
}

在android.ndk中進行ndk的配置,模組名字是必須的。然後使用了log,並且支援armeabi,armeabi-v7a,x86三個平臺。

然後增加jni目錄,在main上右鍵新建jni目錄

Android Studio使用新的Gradle構建工具配置NDK環境

在彈出的視窗中你可以修改jni目錄,預設是在main/jni中

Android Studio使用新的Gradle構建工具配置NDK環境

新建一個Test的類,載入jni庫,宣告native方法

public class Test { static {
        System.loadLibrary("test");
    } public native void test();
}

這時候你會發現test方法是紅色的

Android Studio使用新的Gradle構建工具配置NDK環境

在上面按alt+enter生成c層的方法

Android Studio使用新的Gradle構建工具配置NDK環境

修改為下方的程式碼

#include <jni.h> #include "android/log.h" JNIEXPORT void JNICALL
Java_com_kltz88_car_jnidemo_Test_test(JNIEnv *env, jobject instance) {
    __android_log_write(ANDROID_LOG_ERROR,"TAG","TEST");

}

如果你需要生成標頭檔案,使用命令列即可

Android Studio使用新的Gradle構建工具配置NDK環境

之後會在jni目錄生成對應的標頭檔案

Android Studio使用新的Gradle構建工具配置NDK環境

然後在java層呼叫

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Test t=new Test();
    t.test();
  }
}

便會看到日誌的輸出。

Android Studio使用新的Gradle構建工具配置NDK環境

注意如果沒有在gradle中指定java的對應版本,執行時可能會報錯

tasks.withType(JavaCompile) {
            //指定編譯JDK版本
            sourceCompatibility = JavaVersion.VERSION_1_7
            targetCompatibility = JavaVersion.VERSION_1_7
        }

錯誤資訊如下,遇到該錯誤加上上面的程式碼即可

Android Studio使用新的Gradle構建工具配置NDK環境

最後就是除錯的問題了,理論上來說應該是支援除錯的,但是我在windows上並沒有試驗成功。下面貼出步驟。

Android Studio使用新的Gradle構建工具配置NDK環境

增加native執行方法

Android Studio使用新的Gradle構建工具配置NDK環境

修改為

Android Studio使用新的Gradle構建工具配置NDK環境

然後下斷點,理論上是能除錯的,但是我遇到了下面的問題,導致無法繼續,也查過了,查不出問題所在,就這樣吧,改天在linux下試試是不是正常。

Android Studio使用新的Gradle構建工具配置NDK環境

你會發現整個流程下來,原來的Android.mk和Application.mk都不再需要了,所有配置在gradle中配置即可。

官方的github示例程式碼

https://github.com/googlesamples/android-ndk

相關文章