首先要下載eclipse_java,安裝ADT,CDT,NDK,

 

在MainActivity中寫一些本地函數聲明:
public native void fun1();
public native String fun2();
public native char fun3();
public native int fun4();
public native double fun5();
public native void fun6(int i, String s);




配置好JAVA環境變量;

f8fcbd6d-11c0-30dd-82e3-d3648a43848e  




然後主控台進入項目的bin/classes,輸入javah -jni命令,生成相關.h頭檔;

f9f08a41-6e34-309d-a15b-ee80276a0e3e  


如果報找不到Activity類的話可以暫時去掉MainActivity中的extends Activity聲明,並把與Activity相關代碼注釋,再次編譯後運行javah -jni,就沒有錯了,這時生成一個.h頭檔,com_example_jnitest_MainActivity.h

 

在工程中創建jni目錄,把頭檔移動到裏面,頭檔裏包含了以後要在.c檔中書寫的函數:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jnitest_MainActivity */

 

#ifndef _Included_com_example_jnitest_MainActivity
#define _Included_com_example_jnitest_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jnitest_MainActivity
* Method: fun1
* Signature: ()V
*/
JNIEXPORT void JNICALL JAVA_com_example_jnitest_MainActivity_fun1
(JNIEnv *, jobject);

 

/*
* Class: com_example_jnitest_MainActivity
* Method: fun2
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL JAVA_com_example_jnitest_MainActivity_fun2
(JNIEnv *, jobject);

 

/*
* Class: com_example_jnitest_MainActivity
* Method: fun3
* Signature: ()C
*/
JNIEXPORT jchar JNICALL JAVA_com_example_jnitest_MainActivity_fun3
(JNIEnv *, jobject);

 

/*
* Class: com_example_jnitest_MainActivity
* Method: fun4
* Signature: ()I
*/
JNIEXPORT jint JNICALL JAVA_com_example_jnitest_MainActivity_fun4
(JNIEnv *, jobject);

 

/*
* Class: com_example_jnitest_MainActivity
* Method: fun5
* Signature: ()D
*/
JNIEXPORT jdouble JNICALL JAVA_com_example_jnitest_MainActivity_fun5
(JNIEnv *, jobject);

 

/*
* Class: com_example_jnitest_MainActivity
* Method: fun6
* Signature: (ILjava/lang/String;)V
*/
JNIEXPORT void JNICALL JAVA_com_example_jnitest_MainActivity_fun6
(JNIEnv *, jobject, jint, jstring);

 

#ifdef __cplusplus
}
#endif
#endif





與java原檔中相應的native函數都已經在這個頭檔中聲明好了,以後只要按相應的函數名書寫函數,就可以在java原檔中調用。

 

寫一個Android.mk檔,該檔說明瞭.c檔編譯的相關資訊:


8cdbff3d-4e53-3dc3-a3e1-ab5b703fe2f6  


LOCAL_PATH := $(call my-dir)

 

include $(CLEAR_VARS)

 

LOCAL_MODULE := myjni
LOCAL_SRC_FILES := main.c

 

include $(BUILD_SHARED_LIBRARY)

 

其中指明瞭將main.c便以為myjni;

 

所以開始寫一個main.c



#include<jni.h>
#include<string.h>

 

void JNICALL JAVA_com_example_jnitest_MainActivity_fun1
(JNIEnv *, jobject);

 

jstring JAVA_com_example_jnitest_MainActivity_fun2
(JNIEnv *e, jobject o){
return (*e)->NewStringUTF(e, "I am a string from jni, good!");
}

 

jchar JAVA_com_example_jnitest_MainActivity_fun3
(JNIEnv *, jobject);

 

jint JAVA_com_example_jnitest_MainActivity_fun4
(JNIEnv *, jobject);

 

jdouble JAVA_com_example_jnitest_MainActivity_fun5
(JNIEnv *, jobject);

 

void JAVA_com_example_jnitest_MainActivity_fun6
(JNIEnv *, jobject, jint, jstring);





至於語法可以參考其他資料

 

然後就要為項目添加C編譯器來將C代碼編譯成so檔以便調用:

 

單擊項目->屬性:


438cfb79-0fe6-3d48-8d53-3eedd740ff54  



在builders選項卡中選new,添加一個Program編譯器:

75270b65-d92e-372e-b681-d0af3dd5be00  


編譯器配置介面:

b526cce1-625a-35bb-ac71-fcbba68597eb  


Location是NDK解壓目錄下的ndk-build.cmd

 

WorkingDirectory選擇當前項目空間,保存

85a01b96-4d77-3b99-bb40-ae7b966f9bdb  




這時編譯器清單中多了一個編譯器,將其通過Up移到最高處,以使C代碼能在最先編譯

 

每次便以項目時:Console會顯示:
"Compile thumb : myjni <= main.c

 

SharedLibrary : libmyjni.so

 

Install : libmyjni.so => libs/armeabi/libmyjni.so




說明編譯成功,項目中的lib多了.so檔:

319af92c-dbfa-3a81-9f9e-5537e8385d81  


在java代碼中通過以下聲明調用該鏈接庫:
static{
System.loadLibrary("myjni");
}


86b15056-d996-3977-85ac-5aa6aa2a5aea  



NDK目錄下samples檔夾下提供了一些實例可供參考
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()