這幾天一直在研究JNI的開發過程,順便把NDK環境搭建一起總結下。在windows環境下開發jni需要c/c++編譯器的支持,網絡上我看很多人使用cygwin。呵呵我不是很喜歡使用它,感覺安裝起來挺麻煩的。我使用GNUStep,下載地址http://www.gnustep.org/experience/Windows.html。
下載安裝后,驗證是否成功。打開GNUstep->Shell,輸入make -v 和 gcc -v命令,如圖所示。
配置ndk環境變量,gnustep是模擬linux的環境的,打開gnustep的安裝目錄下的G:\softinstall\GNUstep\GNUstep\GNUstep.conf文件,添加以下內容:
NDK=/g/softinstall/Android/android-ndk-r8b
export=NDK
說明如果不知道ndk目錄在linux下應該是在哪里,你可以打開gnustep的命令窗口,輸入mount,就可以找到對應的盤符。
驗證環境變量,如下圖。?
以上就配置成功了。
下載進入正題啦。Jni的開發步驟。
打開eclipse,新建工程名為testJni。在activity中添加以下代碼
packagecom.xzw.jni;
importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.widget.TextView;
importandroid.support.v4.app.NavUtils;
/**
*
*?@author?XuZhiwei?(xuzhiwei@gmail.com)
*?sina:http://weibo.com/xzw1989
*
*?Create?at?2012-8-30?上午10:49:45
*/
publicclassMainActivityextendsActivity?{
@Override
publicvoidonCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
}
publicnativeString?hello();
static{
System.loadLibrary("testJni");
}
}
編譯后的文件在bin目錄下,通過javah命令生成c/c++的文件頭。如下圖
會在項目目錄下生成jni/com_xzw_jni_TestJni.h。
頭文件代碼如下:
/*?DO?NOT?EDIT?THIS?FILE?-?it?is?machine?generated?*/
#include?
/*?Header?for?class?com_xzw_jni_TestJni?*/
#ifndef?_Included_com_xzw_jni_TestJni
#define?_Included_com_xzw_jni_TestJni
#ifdef?__cplusplus
extern"C"{
#endif
/*
*?Class:?????com_xzw_jni_TestJni
*?Method:????hello
*?Signature:?()Ljava/lang/String;
*/
JNIEXPORT?jstring?JNICALL?Java_com_xzw_jni_TestJni_hello
(JNIEnv?*,?jobject);
#ifdef?__cplusplus
}
#endif
#endif
根據頭文件編寫c代碼
#include?
#include?
jstring
Java_com_xzw_jni_TestJni_hello
(JNIEnv*?env,?jobject?thiz){
return(*env)->NewStringUTF(env,"哈哈完成自動化編譯?!");
}
接下來編寫?Android.mk,該文件可以直接從NDK的samples下的hello-jni的jni文件下直接靠過來改改就可以了。也貼下代碼哈。
#?Copyright?(C)?2009?The?AndroidOpenSource?Project
#
#?Licensed?under?the?Apache?License,?Version?2.0?(the?"License");
#?you?may?notuse?this?fileexceptincompliancewiththe?License.
#?You?may?obtain?a?copy?ofthe?Licenseat
#
#??????http://www.apache.org/licenses/LICENSE-2.0
#
#?Unless?required?byapplicable?laworagreedtoinwriting,?software
#?distributed?under?the?License?isdistributedonan"AS?IS"BASIS,
#?WITHOUT?WARRANTIES?ORCONDITIONSOFANYKIND,?either?expressorimplied.
#?See?the?License?forthe?specific?language?governing?permissionsand
#?limitations?under?the?License.
#
LOCAL_PATH?:=?$(call?my-dir)
include?$(CLEAR_VARS)
LOCAL_MODULE????:=?testJni
LOCAL_SRC_FILES?:=?testJni.c
include?$(BUILD_SHARED_LIBRARY)
其中你只需要該LOCAL_MODULE和LOCAL_SRC_FILES就可以了。
說明:LOCAL_MODULE是描述模塊的,用來給java調用的模塊名,會生成對應的libtestJni.so
LOCAL_SRC_FILES就是源文件啦,多個文件空格隔開即可。
接下來,我們要開始編譯生成so文件咯。
打開gnustep的命令窗口,進入到項目底下,輸入$NDK/ndk-build命令,即可自動生成libs/armeabi/libtestJni.so文件。
接下來就是java調用來。直接上代碼
packagecom.xzw.jni;
importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.widget.TextView;
importandroid.support.v4.app.NavUtils;
/**
*
*?@author?XuZhiwei?(xuzhiwei@gmail.com)
*?sina:http://weibo.com/xzw1989
*
*?Create?at?2012-8-30?上午10:49:45
*/
publicclassTestJniextendsActivity?{
@Override
publicvoidonCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
TextView?tv?=?newTextView(this);
tv.setText(hello());
setContentView(tv);
}
publicnativeString?hello();
static{
System.loadLibrary("testJni");
}
}
運行結果如下