Android NDK簡單地說,就是讓您能夠在你的app當中使用C/C++進行implementation,
它可以把您寫的C/C++ build出一個share object檔案 (*.so) 讓Java call!類似windows中的dll檔!
當然你也可以在JNI call Java method,也就是說是雙向的!
而使用NDK的好處是大概有下面兩個(我只能想到這兩個..)
- 效能較好(depends on situation)
- 可以控制到底層的裝置
不過在Android官網也指出
”you should understand that the NDK will not benefit most apps“所以使用時機要自己斟酌,但我知道蠻多game都是用NDK去implement!
因為需要太多memory,靠自己free效能會較好!
首先先講Android NDK的安裝以及使用方法!
(1) 下載
下載頁面在http://developer.android.com/tools/sdk/ndk/index.html#Downloads
請選擇符合你自己OS的版本!
(如果你使用的是windows!請先下載cygwin,至於cygwin是什麼,前面很多篇文章已經敘述過,這裡不多加敘述)
(2)解壓縮
此篇是用mac,因此就下載osx的版本吧!
下載下來以後就進行解壓縮.
基本上其實就完成了!
在NDK r4之前還需要跑一隻setup script,但之後的就不用了!
其實解壓縮之後裡面就有很多doc可以看!不過都是英文!
(3)建立jni資料夾
在你的$project/底下建立一個jni資料夾!如下:
(4)撰寫C/C++
在$project
先建立一個檔案叫做test-jni.c,
內容如下:
#include <string.h>jstring是return type
#include <jni.h>
jstring
Java_net_kenyang_jni_RunJNI_getText( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
而Java_net_kenyang_jni_RunJNI_getText是這個method的命名規則!
這是JNI的規則,所以請遵守!
開頭一律Java_自己的package名稱_Class名稱_method名稱
你可以改成自己的!但記得後面的步驟也要記得改!
(5)建立Android.mk
一樣在$project/jni底下建立Android.mk檔案
Android.mk這個檔案是用來告訴NDK等等要去build哪些resource!
而我們目前只有一隻test-jni.c,所以檔案內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test-jni
LOCAL_SRC_FILES := test-jni.c
include $(BUILD_SHARED_LIBRARY)
(6)開始build *.so檔案
先開啓你的terminate,然後cd到$project/jni底下
直接在該目錄底下用NDK的tool進行build!
這樣就會產生一個.so檔!
這個檔案會放在$project/lib/armeabi底下!
檔名一定會是lib開頭,.so結尾!
也就是說在這個範例build出來的.so檔案名稱為libtest-jni.so
而build指令如下:
cd xxx/project/jni
xxx/ndk/ndk-build
(7)開始寫code
在你的android project中直接建立一個activity(名稱為RunJNI),
我們將在這個activity中進行呼叫剛剛用c建立的method,
CODE如下:
public class RunJNI extends Activity {
// 宣告一個native method(就是剛剛用c寫的)
private native String getText();
// 載入剛剛的.so檔案!(這裡不需要加上lib,直接去掉就好
static {
System.loadLibrary("test-jni");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.run_jni);
TextView tv = (TextView) findViewById(R.id.textView1);
// 呼叫method,把method回傳的字給textView進行設定
tv.setText(getText());
}
}
完成上面7個步驟就完成了!
直接點選run應該就可以看到下面畫面!