Eclipse下用NDK編譯生成so文件

咱們在安裝環境的時候安裝了NDK,能夠在eclipse下直接生成so文件。NDK的壓縮包裏面自帶了一些sample工程,NDK的文件直接解壓到某個目錄下便可。java

第一次生成so文件的時候,咱們先使用NDK的sample下的hello-jni的例子。eclipse

一、啓動eclipse,經過Create project from existing source,選擇hello-jni的目錄,按默認選項建立工程便可;函數

二、觀察hello-jni的工程目錄結構,發現根目錄下多了一個名叫jni的文件夾,該文件夾下面有兩個文件,Android.mk和hello-jni.c。ui

Android.mk是用來生成so文件的配置文件,咱們來看看裏面是什麼:spa

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)命令行

LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.cip

include $(BUILD_SHARED_LIBRARY)ci

include $(BUILD_SHARED_LIBRARY)表示會生成一個動態連接庫,即so文件,生成的庫文件名稱爲lib*.socmd

LOCAL_MODULE := hello-jni表示將要生成一個名稱爲libhello-jni.so的庫文件string

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目錄下,運行javahcom.example.hellojni.HelloJni,就會把全部native的函數都按規則生成在一個名爲HelloJni.h的頭文件裏。

三、新建並配置一個新的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。

四、生成so文件

因爲咱們勾選了「During auto builds」,因此在工程有所改變的時候,so文件便會自動編譯,正確生成之後就能在工程目錄下發現多了兩個文件夾,文件夾libs\armeabi目錄下生成了一個叫libhello-jni.so的文件。至此,使用NDK生成so文件的工做就完成了。

五、so文件的調用

在HelloJni.java文件中有一段代碼:

static {
System.loadLibrary("hello-jni");
}

使用loadLibrary就能夠加載該so文件了,加載的時候不須要寫libhello-jni.so,只要寫hello-jni就能夠了。

相關文章
相關標籤/搜索