開始使用 Android NDK 進行開發,NDK 的主要原理還是JNI技術,這一技術實現了 Java代碼和 C/C++代碼間的相
互調用,這樣做的好處是:
a. 將一些比較耗時的操作放到底層來實現,畢竟C和C++的效率高比Java高,並且指標是可以加快程式的運行速度;
b. 在C語言領域,已經有很多成熟的類庫和架構,使用NDK後,可以直接使用他們,因而避免再用Java去重複製造輪子。
Android NDK的開發,需要Linux的編譯環境,所以建議直接裝個Linux系統,在上面進行Android開發,當然也可以使用
虛擬機器來代替,不過個人覺得虛擬機器始終不倫不類,還是真正的Linux環境比較順手。
使用NDK時的大致步驟如下: 1.建立一個Android 工程,在裡面建立一個jni 檔案夾,專門用來存放 C 語言程式和Android.mk 檔案 2.在java檔案中編寫一個 native 函數
View Code package tangyuchun.ndk.hellojni;public class HellojniActivity extends Activity { static { System.loadLibrary("hello-jni"); } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText(getString());//調用了native方法 setContentView(tv); } public native static String getString();}
這裡是一個簡單的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,開啟這個標頭檔,內容如下
View Code #include <jni.h>/* Header for class tangyuchun_ndk_hellojni_HellojniActivity */#ifndef _Included_tangyuchun_ndk_hellojni_HellojniActivity#define _Included_tangyuchun_ndk_hellojni_HellojniActivity#ifdef __cplusplusextern "C" {#endif/* * Class: tangyuchun_ndk_hellojni_HellojniActivity * Method: getString * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif
5.看到裡面有一個 函數:JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(JNIEnv *, jclass);這個方法就與第2步的getString()對應。 6.在jni 檔案夾中建立一個 c語言檔案,我的是 hello-jni.c ,include相應的標頭檔,然後將第4步中的那個方法複製,完成該方法:
View Code #include <string.h>#include <stdio.h>#include <android/log.h>#include <stdlib.h>#include <jni.h>JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString( JNIEnv *env, jclass thiz) { return (*env)->NewStringUTF(env, "Some say love"); //這裡只是做個範例,所以只讓他返回一段字串 "Some say love"}
注意,要給方法添加參數,標頭檔中只是聲明,並沒有實參。 7.同樣,在 jni 檔案夾下面建立一個 Android.mk 檔案,內容如下
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := hello-jniLOCAL_SRC_FILES := hello-jni.cinclude $(BUILD_SHARED_LIBRARY)
那個LOCAL_MODULE 就是將要產生的.so 檔案名稱,LOCAL_SRC_FILES就是第6步中編寫的 .c 檔案。 8.儲存上述檔案,開啟終端,定位到工程的目錄下的jni 檔案夾,在終端輸入: ndk-build 命令,斷行符號。 9.返回到工程檔案夾下,就會看到產生了兩個檔案夾 libs 和 obj,其中 libs/armeabi/ 檔案夾下面就有三個檔案,分別是gdb.setup,gdbserver 和libhello-jni.so檔案,這個.so檔案其實就是用來在android中調用C語言的類庫 10. 在Android虛擬機器上運行上面建立的工程,如下所示