AndroidJNI入門第三篇——jni標頭檔案分析
一、 首先寫了java檔案:
- public class HeaderFile {
- private native void doVoid();
- native int doShort();
- native void doArray(Object[] o );
- native int doInt(int i); //byte ,short ,int,long,float,double ,boolean,char
- native int doInt(double d); //byte ,short ,int,long,float,double ,boolean,char
- native int doInt(Object o);
- native int doInt(double d1,double d2);
- static native int doInt(double d1 ,double d2,double d3);
- static native int doInt(double d1 ,float f,boolean b ,char[] c );
- native int doInt(int[] i);
- native int doInt(int[] i1,double[] i2 );
- static native int doInt(int[] i1,double[] i2 ,Object[] o );
- public native String doString(String s);
- public native Object doObject(Object o );
- public native Enumeration doInterface(Iterator it);
- public native Student doStudent(Student s);
- // native int[] doInt(int[] i); //byte ,short ,int,long,float,double ,boolean,char
- public native String[] doString(String[] s);
- public native Object[] doObjects(Object[] o );
- public native Enumeration[] doInterface(Iterator[] it);
- public native Student[] doStudent(Student[] s);
- public native static Object doAll(int[] i , String[] s , Student[] student );
- }
java檔案中包含了private、public、protect等型別的方法,static 方法和非static 方法,返回型別有基礎型別、物件等。
二、下面看一下生成的標頭檔案:
- /* DO NOT EDIT THIS FILE – it is machine generated */
- #include <jni.h>
- /* Header for class com_nedu_jni_helloword_HeaderFile */
- #ifndef _Included_com_nedu_jni_helloword_HeaderFile
- #define _Included_com_nedu_jni_helloword_HeaderFile
- #ifdef __cplusplus
- extern “C” {
- #endif
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doVoid
- * Signature: ()V
- */
- JNIEXPORT void JNICALL Java_com_nedu_jni_helloword_HeaderFile_doVoid
- (JNIEnv *, jobject);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doShort
- * Signature: ()I
- */
- JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doShort
- (JNIEnv *, jobject);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doArray
- * Signature: ([Ljava/lang/Object;)V
- */
- JNIEXPORT void JNICALL Java_com_nedu_jni_helloword_HeaderFile_doArray
- (JNIEnv *, jobject, jobjectArray);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInt
- * Signature: (I)I
- */
- JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__I
- (JNIEnv *, jobject, jint);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInt
- * Signature: (D)I
- */
- JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__D
- (JNIEnv *, jobject, jdouble);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInt
- * Signature: (Ljava/lang/Object;)I
- */
- JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__Ljava_lang_Object_2
- (JNIEnv *, jobject, jobject);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInt
- * Signature: (DD)I
- */
- JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DD
- (JNIEnv *, jobject, jdouble, jdouble);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInt
- * Signature: (DDD)I
- */
- JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DDD
- (JNIEnv *, jclass, jdouble, jdouble, jdouble);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInt
- * Signature: (DFZ[C)I
- */
- JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DFZ_3C
- (JNIEnv *, jclass, jdouble, jfloat, jboolean, jcharArray);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInt
- * Signature: ([I)I
- */
- JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt___3I
- (JNIEnv *, jobject, jintArray);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInt
- * Signature: ([I[D)I
- */
- JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt___3I_3D
- (JNIEnv *, jobject, jintArray, jdoubleArray);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInt
- * Signature: ([I[D[Ljava/lang/Object;)I
- */
- JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt___3I_3D_3Ljava_lang_Object_2
- (JNIEnv *, jclass, jintArray, jdoubleArray, jobjectArray);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doString
- * Signature: (Ljava/lang/String;)Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_com_nedu_jni_helloword_HeaderFile_doString__Ljava_lang_String_2
- (JNIEnv *, jobject, jstring);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doObject
- * Signature: (Ljava/lang/Object;)Ljava/lang/Object;
- */
- JNIEXPORT jobject JNICALL Java_com_nedu_jni_helloword_HeaderFile_doObject
- (JNIEnv *, jobject, jobject);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInterface
- * Signature: (Ljava/util/Iterator;)Ljava/util/Enumeration;
- */
- JNIEXPORT jobject JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInterface__Ljava_util_Iterator_2
- (JNIEnv *, jobject, jobject);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doStudent
- * Signature: (Lcom/nedu/jni/helloword/Student;)Lcom/nedu/jni/helloword/Student;
- */
- JNIEXPORT jobject JNICALL Java_com_nedu_jni_helloword_HeaderFile_doStudent__Lcom_nedu_jni_helloword_Student_2
- (JNIEnv *, jobject, jobject);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doString
- * Signature: ([Ljava/lang/String;)[Ljava/lang/String;
- */
- JNIEXPORT jobjectArray JNICALL Java_com_nedu_jni_helloword_HeaderFile_doString___3Ljava_lang_String_2
- (JNIEnv *, jobject, jobjectArray);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doObjects
- * Signature: ([Ljava/lang/Object;)[Ljava/lang/Object;
- */
- JNIEXPORT jobjectArray JNICALL Java_com_nedu_jni_helloword_HeaderFile_doObjects
- (JNIEnv *, jobject, jobjectArray);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInterface
- * Signature: ([Ljava/util/Iterator;)[Ljava/util/Enumeration;
- */
- JNIEXPORT jobjectArray JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInterface___3Ljava_util_Iterator_2
- (JNIEnv *, jobject, jobjectArray);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doStudent
- * Signature: ([Lcom/nedu/jni/helloword/Student;)[Lcom/nedu/jni/helloword/Student;
- */
- JNIEXPORT jobjectArray JNICALL Java_com_nedu_jni_helloword_HeaderFile_doStudent___3Lcom_nedu_jni_helloword_Student_2
- (JNIEnv *, jobject, jobjectArray);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doAll
- * Signature: ([I[Ljava/lang/String;[Lcom/nedu/jni/helloword/Student;)Ljava/lang/Object;
- */
- JNIEXPORT jobject JNICALL Java_com_nedu_jni_helloword_HeaderFile_doAll
- (JNIEnv *, jclass, jintArray, jobjectArray, jobjectArray);
- #ifdef __cplusplus
- }
- #endif
- #endif
三、標頭檔案分析如下:
1、檔案的前九行就不用說了,他們是是C、C++的頭,應該很好理解。
2、方法的註釋部分,每個方法都有它的註釋部分,這些都是相似的,對其中一個分析:
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doVoid
- * Signature: ()V
- */
註釋部分分為三部分Class、Method、Signature。
Class:表示Native方法的類名稱。
Method:表示方法名稱
Signature:是方法的標識,它是一個識別符號,主要供我們在JNI操作java物件的方法使用的。
Signature一般是兩部分構成,一個方法的引數,另一個是返回型別。方法引數在括號裡面,返回型別在後面,
例如
- ()V 返回為void,沒有引數。
- (DFZ[C)I 返回為int,引數為double、float、char[]
- (Ljava/lang/String;)Ljava/lang/String;返回String,引數為String
如果不清楚其中的字元含義,就不能知道其中的意思,其中字元對應有基本型別、物件型別、陣列型別。分析如下
1)基本型別的對應關係如下:
2) 方法引數或者返回值為java中的物件時,必須以“L”加上其路徑,不過此路徑必須以“/”分開,自定義的物件也使用本規則,不在包中時直接“L”加上類名稱。比如說java.lang.String為“java/lang/String”,com.nedu.jni.helloword.Student為”com/nedu/jni/helloword/Student”
3)方法引數或者返回值為陣列時型別前加上[,例如[I表示int[],[[[D表示 double[][][],即幾維陣列就加幾個[。
看一下例子:
3、方法的宣告
- JNIEXPORT void JNICALL Java_com_nedu_jni_helloword_HeaderFile_doArray(JNIEnv *,jobject,jobjectArray);
從上面的標頭檔案可以看出方法基本有7部分組成。
1、3部分是都是JNI的關鍵字,表示此函式是要被JNI呼叫的。
2、表示方法的返回型別
4、為JNI中標識此方法來源於java的標識頭
5、方法所在類的包名+類名
6、方法名
7、引數,它們有一個共同的特點,包含JNIEnv *――它是一個介面指標,用於定位函式表中的函式!
在JNI規範中一般稱 為 “Interface Pointer”。看到這兒好像和過程呼叫很類似了!是的,JNI中
的操作過程,就是程式導向的!後面的jobject是 一個指向該類的指標,類似與C語言中的this。這個
第二個引數是變化的,當該方法為類的例項方法時該引數為jobject;當該方法為類方法(即靜態方法)
時該引數為jclass,指向該類的class。
根據不同方法字首生成的標頭檔案比較如下:
1、static與非static的比較:
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInt
- * Signature: (DD)I
- */
- JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DD
- (JNIEnv *, <span style=“background-co
- lor: rgb(255, 0, 0);”>jobject</span>, jdouble, jdouble);
- /*
- * Class: com_nedu_jni_helloword_HeaderFile
- * Method: doInt
- * Signature: (DDD)I
- */
- JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DDD
- (JNIEnv *, <span style=“color:#000000;background-color: rgb(255, 0, 0);”>jclass</span>, jdouble, jdouble, jdouble);
第一個是非static方法,第二個是static方法,不同點如上紅色標記。其中的不同將在以後提到。
2、 private、friendly、protected以及public這些方法限制符不會在JNI的標頭檔案中出現。這些訪問修飾符只有在其它類
使用這些方法時有效!JNI中不關心此修飾符!
- /**
- * @author 張興業
- * 郵箱:xy-zhang@163.com
- * qq:363302850
- */
相關文章
- 標頭檔案的作用分析
- IDEA下JNI開發快速生成標頭檔案方法Idea
- 8.13 標頭檔案剖析:標頭檔案路徑(下)
- C 標頭檔案
- gcc 標頭檔案依賴關係 分析工具GC
- Android - JNI加入標準C++檔案AndroidC++
- #include sys/xxx.h標頭檔案 UNIX標頭檔案
- locate標頭檔案和庫檔案
- AndroidJNI入門第一篇——HelloWordAndroid
- C 標頭檔案 作用
- 祖傳標頭檔案
- 標頭檔案講解
- fcntl.h標頭檔案
- linux 標頭檔案 作用Linux
- 什麼是 標頭檔案
- 02@在類的標頭檔案中儘量少引入其他標頭檔案
- JNI 檔案遍歷
- C/C++標頭檔案太難記?一個萬能標頭檔案全搞定!C++
- c++筆記_標頭檔案C++筆記
- Nt函式原型標頭檔案函式原型
- C語言 - 標頭檔案包含C語言
- 標頭檔案與庫檔案與菜鳥 (轉)
- 巨集_變數_函式_指標_標頭檔案變數函式指標
- EclipseCDT標準庫標頭檔案設定Eclipse
- POSIX.1 and ISO C標準標頭檔案
- C++標準庫標頭檔案介紹C++
- dtd檔案入門
- C/C++標頭檔案一覽C++
- linux下使用windows標頭檔案LinuxWindows
- 關於C++的標頭檔案C++
- 8.8 標頭檔案剖析:基本概念
- C++ 預編譯標頭檔案C++編譯
- 避免標頭檔案重複定義
- 關於傳送Http標頭檔案HTTP
- C/C++標頭檔案說明C++
- DES演算法,標頭檔案 (轉)演算法
- 看標頭檔案猜演算法演算法
- 大型專案開發: 標頭檔案順序