開始使用 Android NDK 進行開發,NDK 的主要原理還是 JNI 技術,這一技術實現了 Java代碼和 C/C++代碼間的相互調用,這樣做的好處是:首先,將一些比較耗時的操作放到底層來實現,畢竟C和C++的效率高比Java高,並且指針是可以加快程序的運行速度;其次. 在C語言領域,已經有很多成熟的類庫和框架,使用NDK後,可以直接使用他們,因而避免再用Java去重復制造輪子。
Android NDK的開發,需要Linux的編譯環境,所以建議直接裝個Linux系統,在上面進行Android開發,當然也可以使用虛擬機來代替,不過個人覺得虛擬機始終不倫不類,還是真正的Linux環境比較順手。
使用NDK時的大致步驟如下:
1. 新建一個Android 工程,在裡面新建一個jni 文件夾,專門用來存放 C 語言程序和Android.mk 文件;
2. 在java文件中編寫一個 native 函數:
這裡是一個簡單的Activity界面,裡面定義了一個 getString()方法,用來獲取一個字符串。
3. 打開終端,使用 javah -classpath 命令編譯 bin/classes 下生成的 .class文件。我的命令如下:
javah -classpath /home/administrator/android_code/hello-jni/bin/classes tangyuchun.ndk.hellojni.HellojniActivity
也可以在src的 .java 源代碼中使用同樣的命令:
javah -classpath /home/administrator/android_code/hello-jni/src tangyuchun.ndk.hellojni.HellojniActivity
記得在前面要加上包名(我的是在tangyuchun.ndk.hellojni 這個包下面)。
4. 經過第3步後,就會在該類目錄下生成一個 .h 的頭文件(Ubuntu也有可能生成在主文件夾下面),名字為
tangyuchun_ndk_hellojni_HellojniActivity.h,打開這個頭文件,內容如下:
5. 看到裡面有一個函數: JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(JNIEnv *, jclass);
這個方法就與第2步的getString()對應。
6. 在jni 文件夾中新建一個 c語言文件,我的是 hello-jni.c ,include相應的頭文件,然後將第4步中的那個方法復制,完成該方法:
注意,要給方法添加參數,頭文件中只是聲明,並沒有實參。
7. 同樣,在 jni 文件夾下面新建一個 Android.mk 文件,內容如下:
那個LOCAL_MODULE 就是將要生成的.so 文件名,LOCAL_SRC_FILES就是第6步中編寫的 .c 文件。
8. 保存上述文件,打開終端,定位到工程的目錄下的jni 文件夾,在終端輸入: ndk-build 命令,回車。
9. 返回到工程文件夾下,就會看到生成了兩個文件夾 libs 和 obj,其中 libs/armeabi/ 文件夾下面就有 一個libhello-jni.so文件,這
個.so文件其實就是用來在android中調用C語言的類庫;
10. 在Android虛擬機上運行上面建立的工程,如下所示: