總結(jié)一下Eclipse環(huán)境下用NDK編譯JNI使用的.so庫的詳細(xì)步驟:
1.下載NDK(注意區(qū)分32位/64位系統(tǒng))螺男;
2.解壓NDK到任意目錄(最好沒有中文沪停,有中文是否可用沒有測(cè)試過)阻肿;
3.配置NDK環(huán)境變量:
將NDK解壓路徑添加到高級(jí)系統(tǒng)設(shè)置-->系統(tǒng)變量-->Path中(例如我的ndk路徑:D:\android-ndk32-r10b-windows-x86\android-ndk-r10b)玖像;
4.Eclipse中配置NDK:
Window-->Preferences-->Android-->NDK摄欲,添加NDK Location(同上路徑)郑趁;
5.創(chuàng)建JNI Android工程:
1)編寫native方法:
<pre>
public class FirstJni{
public native String fromJniStr();
// 使用loadLibrary加載so文件刊驴,加載的時(shí)候不需要寫lib
static{
System.loadLibrary("first-jni");
}
}
</pre>
2)生成頭文件
用命令行方式進(jìn)入工程目錄的bin\classes目錄下-->javah com.example.j_one.FirstJni-->生成com_example_jone_FirstJni.h文件;
<pre>
/* DO NOT EDIT THIS FILE - it is machine generated */
include <jni.h>
/* Header for class com_example_jone_FirstJni */
ifndef _Included_com_example_jone_FirstJni
define _Included_com_example_jone_FirstJni
ifdef __cplusplus
extern "C" {
endif
/*
- Class: com_example_jone_FirstJni
- Method: fromJniStr
- Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_jone_FirstJni_fromJniStr
(JNIEnv *, jobject);
ifdef __cplusplus
}
endif
endif
</pre>
該頭文件需要使用的是根據(jù)Java中native方法所生成的C方法名稱穿撮。命名規(guī)則為:
Java_(固定開頭)com_example_jone(用"_"連接的包名)_FirstJni(類名)_fromJniStr(函數(shù)名)
3)創(chuàng)建jni文件夾缺脉,編寫C文件
<pre>
include <string.h>
include <jni.h>
jstring Java_com_example_jone_FirstJni_fromJniStr( JNIEnv* env, jobject thiz )
{
return (*env)->NewStringUTF(env, "Message from First JNI !");
}
</pre>
4)編寫Android.mk文件
<pre>
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := first-jni #表示將要生成一個(gè)名稱為libhello-jni.so的庫文件
LOCAL_SRC_FILES := first-jni.c #表示生成庫文件的源文件是hello-jni.c
include $(BUILD_SHARED_LIBRARY) #表示會(huì)生成一個(gè)動(dòng)態(tài)鏈接庫,即so文件悦穿,生成的庫文件名稱為lib*.so
</pre>
6.新建并配置一個(gè)新的Builder
1) 點(diǎn)擊Project->Properties->Builders->New攻礼,新建立一個(gè)Builder。在彈出的對(duì)話框上面點(diǎn)擊Program栗柒,點(diǎn)擊OK礁扮;
2) 在彈出的對(duì)話框【Edit Configuration】中,配置選項(xiàng)卡【Main】:
Location中需要填入nkd-build.cmd的路徑(NDK安裝目錄下)瞬沦。
WorkingDiretcoty中需要填入HelloJni的工程根目錄太伊。
3) 在【EditConfiguration】中,配置選項(xiàng)卡【Refresh】:
勾選“Refresh resources upon completion”逛钻,
勾選“The entire workspace”僚焦,
勾選“Recuresively include sub-folders”。
4)在【EditConfiguration】中曙痘,配置選項(xiàng)卡【Build Options】:
勾選“After a “Clean””芳悲,
勾選“During manual builds”,
勾選“During auto builds”,
勾選“Specify working set of relevant resources”边坤。
點(diǎn)擊“Specify Resources…”勾選TestNDK工程的“jni“目錄名扛,F(xiàn)inish!
保存設(shè)置茧痒,點(diǎn)擊OK肮韧。
7.生成so文件
由于我們勾選了“During auto builds”,所以在工程有所改變的時(shí)候,so文件便會(huì)自動(dòng)編譯弄企,正確生成以后就能在工程目錄下發(fā)現(xiàn)多了兩個(gè)文件夾超燃,文件夾libs\armeabi目錄下生成了一個(gè)叫l(wèi)ibfirst-jni.so的文件。至此桩蓉,使用NDK生成so文件的工作就完成了淋纲。