從Android Studio 1.3 Beta1開始,就支持了NDK,我目前使用的版本是1.5.首先強調幾點。
1.必須安裝NDK並配置好環境變量(和配置JDK環境變量如出一轍:新建NDK_HOME我的變量值為D:\android-sdk-windows\ndk-bundle
在Path變量最后加上;%NDK_HOME%)
2.目前的NDK只支持gradle2.5,版本高了或低了都不行(后面還會說到)
接下來我通過實際建立一個工程賴演示NDK在Android Studio中的用法。我會一步一步的來,方便大家學習。
我們首先向平時一樣建立一個空的項目模板,修改設置,設置Gradle版本為2.5

接下來我們需要將根目錄下的gradle修改為實驗性的gradle如下所示:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle-experimental:0.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
因為需要gradle2.5的支持,我們需要需要將gradle/gradle-wrapper.properties中的版本修改為2.5,如下所示:
#Wed Oct 21 11:34:03 PDT 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip然后到了最容易出錯的地方: 修改原來的app/build.gradle,如下所示:
apply plugin: 'com.android.model.application'//這里加上.model //在android{......}外面加上一層model{}, // 將android{......}中的buildTypes移動到android{}外面,但在model{}里面。 //對buildTypes做一些修改 //在android{}里面添加一個task.withType(JavaCompile){......} //在model{}里面添加一個android.ndk{......} //刪除dependencies{......}中的testCompile 'junit:junit:4.12' //最后要注意等於號要一一對應,不要漏寫 model { android { compileSdkVersion = 23 buildToolsVersion = "23.0.3" defaultConfig.with { applicationId = "com.ndkexample" minSdkVersion.apiLevel = 14 targetSdkVersion.apiLevel = 23 versionCode = 1 versionName = "1.0" } task.withType(JavaCompile) { //指定編譯JDK版本 sourceCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_1_7 } } android.ndk { moduleName = "ndkexample"//這個是將來生成的so文件的名稱,可任意取 ldLibs += "log"//引入打印日志信息的包 //支持armeabi,armeabi-v7a,x86三個平台 abiFilters += "armeabi" abiFilters += "armeabi-v7a" abiFilters += "x86" } android.buildTypes { release { minifyEnabled false proguardFiles += file('proguard-rules.pro') } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) /*testCompile 'junit:junit:4.12'*///這一行刪去 compile 'com.android.support:appcompat-v7:23.4.0' }
此處可以編譯一下,看看是否出錯,如果出錯請仔細核對是否字符錯誤或包名沒有改成你自己的。
據Google官網上說 在官網上說,因為 NDK 還是實驗版,不得已才讓用戶自己改代碼,他們會逐漸讓這些東西自動化。在app/src/main文件夾上點右鍵,在彈出菜單中選擇“New”、“Folder”、“JNI Folder”,按提示進行。
有一個“Change Folder Location”選項,不需要勾選,因為jni文件夾采用默認的位置(在main文件夾中)就行。然后main目錄下會出現jni文件夾。
新建一個MyExample的類(與MainActivity在同一目錄下),加載jni庫,聲明native方法
此時你的myLog方法還是紅色的, 在上面按alt+enter生成c層的方法。package com.ndkexample; public class MyExample { static { System.loadLibrary("ndkexample"); } public native void myLog();//打印日志信息的函數 }
添加一個打印日志的方法_android_log_write(......);
#include <jni.h> #include "android/log.h" JNIEXPORT void JNICALL Java_com_ndkexample_MyExample_myLog(JNIEnv *env, jobject instance) { // TODO __android_log_write(ANDROID_LOG_ERROR,"MainActivity","This is my first ndkexample!"); }尤其不要忘記引入頭文件log.h
之后clean project會在jni目錄生成對應的頭文件
然后在java層進行調用
package com.ndkexample; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyExample myExample=new MyExample(); myExample.myLog(); } }
編譯運行可以看到日志信息被打印出來
06-22 20:36:25.984 31550-31550/? I/art: Late-enabling -Xcheck:jni06-22 20:36:26.029 31550-31558/? I/art: Debugger is no longer active
06-22 20:36:26.057 31550-31550/? I/HwCust: Constructor found for class android.app.HwCustHwWallpaperManagerImpl
06-22 20:36:26.104 31550-31550/? I/HwCust: Constructor found for class android.widget.HwCustTextViewImpl
06-22 20:36:26.109 31550-31550/? I/HwCust: Constructor found for class android.widget.HwCustTextViewImpl
06-22 20:36:26.114 31550-31550/? E/MainActivity: This is my first ndkexample!
06-22 20:36:26.175 31550-31630/? I/OpenGLRenderer: Initialized EGL, version 1.4
至此成功。
如果遇到問題無法解決可以咨詢我的QQ:1925554595
