我們在安裝環境的時候安裝了NDK,可以在eclipse下直接生成so文件。NDK的壓縮包裡面自帶了一些sample工程,NDK的文件直接解壓到某個目錄下即可。 第一次生成so文件的時候,我們先使用NDK的sample下的hello-jni的例子。 1、啟動eclipse,通過Create proje ...
我們在安裝環境的時候安裝了NDK,可以在eclipse下直接生成so文件。NDK的壓縮包裡面自帶了一些sample工程,NDK的文件直接解壓到某個目錄下即可。 第一次生成so文件的時候,我們先使用NDK的sample下的hello-jni的例子。 1、啟動eclipse,通過Create project from existing source,選擇hello-jni的目錄,按預設選項創建工程即可; 2、觀察hello-jni的工程目錄結構,發現根目錄下多了一個名叫jni的文件夾,該文件夾下麵有兩個文件,Android.mk和hello-jni.c。 Android.mk是用來生成so文件的配置文件,我們來看看裡面是什麼: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY) include $(BUILD_SHARED_LIBRARY)表示會生成一個動態鏈接庫,即so文件,生成的庫文件名稱為lib*.so LOCAL_MODULE := hello-jni表示將要生成一個名稱為libhello-jni.so的庫文件 LOCAL_SRC_FILES := hello-jni.c表示生成庫文件的源文件是hello-jni.c 打開hello-jni.c文件,會看到裡面有一個函數: jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { return (*env)->NewStringUTF(env, "Hello from JNI !"); } 這個函數從根據什麼原則生成的呢?是根據src下的HelloJni.java文件中的函數 public native String stringFromJNI();生成的。命名規則為: Java_(固定開頭)com_example_hellojni(用"_"連接的包名)_HelloJni(類名)_stringFromJNI(函數名) 這個函數的生成可以使用javah的命令:用命令行方式進入工程目錄的bin\classes目錄下,運行javah com.example.hellojni.HelloJni,就會把所有native的函數都按規則生成在一個名為HelloJni.h的頭文件里。 3、新建並配置一個新的Builder 1) 點擊Project->Properties->Builders->New,新建立一個Builder。在彈出的對話框上面點擊Program,點擊OK; 2) 在彈出的對話框【Edit Configuration】中,配置選項卡【Main】: Location中需要填入nkd-build.cmd的路徑(NDK安裝目錄下)。 WorkingDiretcoty中需要填入HelloJni的工程根目錄。 3) 在【EditConfiguration】中,配置選項卡【Refresh】: 勾選“Refresh resources upon completion”, 勾選“The entire workspace”, 勾選“Recuresively include sub-folders”。 4)在【EditConfiguration】中,配置選項卡【Build Options】: 勾選“After a “Clean””, 勾選“During manual builds”, 勾選“During auto builds”, 勾選“Specify working set of relevant resources”。 點擊“Specify Resources…”勾選TestNDK工程的“jni“目錄,Finish! 保存設置,點擊OK。 4、生成so文件 由於我們勾選了“During auto builds”,所以在工程有所改變的時候,so文件便會自動編譯,正確生成以後就能在工程目錄下發現多了兩個文件夾,文件夾libs\armeabi目錄下生成了一個叫libhello-jni.so的文件。至此,使用NDK生成so文件的工作就完成了。 5、so文件的調用 在HelloJni.java文件中有一段代碼: static { System.loadLibrary("hello-jni"); } 使用loadLibrary就可以載入該so文件了,載入的時候不需要寫libhello-jni.so,只要寫hello-jni就可以了。