24 October 2012
這篇主要講怎麼安裝以及使用Android NDK,
Android NDK簡單地說,就是讓您能夠在你的app當中使用C/C++進行implementation,
它可以把您寫的C/C++ build出一個share object檔案 (*.so) 讓Java call!類似windows中的dll檔!
當然你也可以在JNI call Java method,也就是說是雙向的!
而使用NDK的好處是大概有下面兩個(我只能想到這兩個..)
  1. 效能較好(depends on situation)
  2. 可以控制到底層的裝置


不過在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資料夾!如下:
$project/jni

(4)撰寫C/C++
在$project/jni底下開始寫C/C++的code了!
先建立一個檔案叫做test-jni.c,
內容如下:
#include <string.h>
#include <jni.h>

jstring
Java_net_kenyang_jni_RunJNI_getText( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
jstring是return type
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應該就可以看到下面畫面! 











    


blog comments powered by Disqus