先介紹下個人軟件環境java
android studio 1.5android
ndk r10e,c++
gradle-experimental:0.6.0-beta5 (top-level build.gradle)api
gradle-2.10-all.zip(gradle/wrapper/gradle-wrapper.properties)app
app.gradle,紅色字體爲修改部分ide
apply plugin: 'com.android.model.application'
model{
android {
compileSdkVersion=23
buildToolsVersion="23.0.1"
defaultConfig {
applicationId "com.example.user.myapplication"
minSdkVersion.apiLevel 14
targetSdkVersion.apiLevel 23
versionCode 1
versionName "1.0"
}
ndk { moduleName "HelloNDK" }
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file("proguard-rules.pro"))
}
}
// Configures source set directory.
sources { main { java { source { srcDir "src" } } } }
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.1.1'
}
還須要在local.properties文件中設置ndk路徑,以下,具體路徑根據你安裝的ndk路徑而定測試
ndk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Ndk\\android-ndk-r10e
sdk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk
也能夠右鍵項目名稱,選擇open modules setting(F4),而後選擇SDK Location項,而後設置android NDK Location項的值,效果是同樣的。字體
而後main右鍵——New——folder——JNI Folder添加jni文件夾,全部.c/.c++文件都應該放到此處.當前版本的NDK有bug,因此須要先在這個文件夾內生產一個空的c文件,gradle
jni文件夾右鍵——New——C/C++ Source File——Name欄能夠任意輸入,type欄選擇文件類型,而後ok確認以後自動生成.c和.h文件,不須要改動內容.ui
至此環境已經搭建完成。
而後是測試例子,這裏在MainActivity中測試
public class MainActivity extends AppCompatActivity { static { System.loadLibrary("HelloNDK"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.tv); tv.setText(this.get()); } public native String get(); public native void set(String str); }
onCreate就是用一個文本框來顯示從C方法裏面返回的值。關鍵點在紅色字體部分,其中System.loadLibrary("HelloNDK")是用來加載C庫,public native String get();public native void set(String str);兩個方法則是聲明C庫裏面有這2個方法.固然如今jni文件夾裏面並無HelloNDK.c這個文件,因此會提示錯誤,這時只要選中方法名,而後alt+enter,而後選擇Create funcation XXX,就會在jni文件夾中自動生成HelloNDK.c文件,該文件裏面會自動生成符合jni規則的對應C方法,而後只須要實現該方法體,就完成了簡單的ndk實例.
HelloNDK.c文件內容以下,紅色字體爲手動修改部分,其他部分均爲自動生成
#include <jni.h> JNIEXPORT jstring JNICALL Java_main_java_com_sunyang_ndkapplication_MainActivity_get(JNIEnv *env, jobject instance) { // TODO return (*env)->NewStringUTF(env, "hello ndk"); } JNIEXPORT void JNICALL Java_main_java_com_sunyang_ndkapplication_MainActivity_set(JNIEnv *env, jobject instance, jstring str_) { const char *str = (*env)->GetStringUTFChars(env, str_, 0); // TODO (*env)->ReleaseStringUTFChars(env, str_, str); }
完成以後運行,手機界面上的TextView應該會顯示hello ndk.
至此環境搭建和實例測試結束從使用體驗上來看,使用NDK來調用jni十分簡單,開發時只須要把精力集中在代碼邏輯上,不用去作繁瑣的設置。期待正式版本的到來.