Android(安卓)JNI入门第三篇――jni头文件分析
一、 首先写了java文件:
- publicclassHeaderFile{
- privatenativevoiddoVoid();
- nativeintdoShort();
- nativevoiddoArray(Object[]o);
- nativeintdoInt(inti);//byte,short,int,long,float,double,boolean,char
- nativeintdoInt(doubled);//byte,short,int,long,float,double,boolean,char
- nativeintdoInt(Objecto);
- nativeintdoInt(doubled1,doubled2);
- staticnativeintdoInt(doubled1,doubled2,doubled3);
- staticnativeintdoInt(doubled1,floatf,booleanb,char[]c);
- nativeintdoInt(int[]i);
- nativeintdoInt(int[]i1,double[]i2);
- staticnativeintdoInt(int[]i1,double[]i2,Object[]o);
- publicnativeStringdoString(Strings);
- publicnativeObjectdoObject(Objecto);
- publicnativeEnumerationdoInterface(Iteratorit);
- publicnativeStudentdoStudent(Students);
- //nativeint[]doInt(int[]i);//byte,short,int,long,float,double,boolean,char
- publicnativeString[]doString(String[]s);
- publicnativeObject[]doObjects(Object[]o);
- publicnativeEnumeration[]doInterface(Iterator[]it);
- publicnativeStudent[]doStudent(Student[]s);
- publicnativestaticObjectdoAll(int[]i,String[]s,Student[]student);
- }
java文件中包含了private、public、protect等类型的方法,static 方法和非static 方法,返回类型有基础类型、对象等。
二、下面看一下生成的头文件:
- /*DONOTEDITTHISFILE-itismachinegenerated*/
- #include<jni.h>
- /*Headerforclasscom_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
- */
- JNIEXPORTvoidJNICALLJava_com_nedu_jni_helloword_HeaderFile_doVoid
- (JNIEnv*,jobject);
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doShort
- *Signature:()I
- */
- JNIEXPORTjintJNICALLJava_com_nedu_jni_helloword_HeaderFile_doShort
- (JNIEnv*,jobject);
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doArray
- *Signature:([Ljava/lang/Object;)V
- */
- JNIEXPORTvoidJNICALLJava_com_nedu_jni_helloword_HeaderFile_doArray
- (JNIEnv*,jobject,jobjectArray);
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doInt
- *Signature:(I)I
- */
- JNIEXPORTjintJNICALLJava_com_nedu_jni_helloword_HeaderFile_doInt__I
- (JNIEnv*,jobject,jint);
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doInt
- *Signature:(D)I
- */
- JNIEXPORTjintJNICALLJava_com_nedu_jni_helloword_HeaderFile_doInt__D
- (JNIEnv*,jobject,jdouble);
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doInt
- *Signature:(Ljava/lang/Object;)I
- */
- JNIEXPORTjintJNICALLJava_com_nedu_jni_helloword_HeaderFile_doInt__Ljava_lang_Object_2
- (JNIEnv*,jobject,jobject);
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doInt
- *Signature:(DD)I
- */
- JNIEXPORTjintJNICALLJava_com_nedu_jni_helloword_HeaderFile_doInt__DD
- (JNIEnv*,jobject,jdouble,jdouble);
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doInt
- *Signature:(DDD)I
- */
- JNIEXPORTjintJNICALLJava_com_nedu_jni_helloword_HeaderFile_doInt__DDD
- (JNIEnv*,jclass,jdouble,jdouble,jdouble);
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doInt
- *Signature:(DFZ[C)I
- */
- JNIEXPORTjintJNICALLJava_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
- */
- JNIEXPORTjintJNICALLJava_com_nedu_jni_helloword_HeaderFile_doInt___3I
- (JNIEnv*,jobject,jintArray);
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doInt
- *Signature:([I[D)I
- */
- JNIEXPORTjintJNICALLJava_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
- */
- JNIEXPORTjintJNICALLJava_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;
- */
- JNIEXPORTjstringJNICALLJava_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;
- */
- JNIEXPORTjobjectJNICALLJava_com_nedu_jni_helloword_HeaderFile_doObject
- (JNIEnv*,jobject,jobject);
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doInterface
- *Signature:(Ljava/util/Iterator;)Ljava/util/Enumeration;
- */
- JNIEXPORTjobjectJNICALLJava_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;
- */
- JNIEXPORTjobjectJNICALLJava_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;
- */
- JNIEXPORTjobjectArrayJNICALLJava_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;
- */
- JNIEXPORTjobjectArrayJNICALLJava_com_nedu_jni_helloword_HeaderFile_doObjects
- (JNIEnv*,jobject,jobjectArray);
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doInterface
- *Signature:([Ljava/util/Iterator;)[Ljava/util/Enumeration;
- */
- JNIEXPORTjobjectArrayJNICALLJava_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;
- */
- JNIEXPORTjobjectArrayJNICALLJava_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;
- */
- JNIEXPORTjobjectJNICALLJava_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、方法的声明
- JNIEXPORTvoidJNICALLJava_com_nedu_jni_helloword_HeaderFile_doArray(JNIEnv*,jobject,jobjectArray);
从上面的头文件可以看出方法基本有7部分组成。
1、3部分是都是JNI的关键字,表示此函数是要被JNI调用的。
2、表示方法的返回类型
4、为JNI中标识此方法来源于java的标识头
5、方法所在类的包名+类名
6、方法名
7、参数,它们有一个共同的特点,包含JNIEnv *�D�D它是一个接口指针,用于定位函数表中的函数!
在JNI规范中一般称 为 “Interface Pointer”。看到这儿好像和过程调用很类似了!是的,JNI中
的操作过程,就是面向过程的!后面的jobject是 一个指向该类的指针,类似与C语言中的this。这个
第二个参数是变化的,当该方法为类的实例方法时该参数为jobject;当该方法为类方法(即静态方法)
时该参数为jclass,指向该类的class。
根据不同方法前缀生成的头文件比较如下:
1、static与非static的比较:
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doInt
- *Signature:(DD)I
- */
- JNIEXPORTjintJNICALLJava_com_nedu_jni_helloword_HeaderFile_doInt__DD
- (JNIEnv*,<spanstyle="background-color:rgb(255,0,0);">jobject</span>,jdouble,jdouble);
- /*
- *Class:com_nedu_jni_helloword_HeaderFile
- *Method:doInt
- *Signature:(DDD)I
- */
- JNIEXPORTjintJNICALLJava_com_nedu_jni_helloword_HeaderFile_doInt__DDD
- (JNIEnv*,<spanstyle="color:#000000;background-color:rgb(255,0,0);">jclass</span>,jdouble,jdouble,jdouble);
第一个是非static方法,第二个是static方法,不同点如上红色标记。其中的不同将在以后提到。
2、private、friendly、protected以及public这些方法限制符不会在JNI的头文件中出现。这些访问修饰符只有在其它类
使用这些方法时有效!JNI中不关心此修饰符!
- /**
- *@author张兴业
- *邮箱:[email protected]
- *qq:363302850
- */
更多相关文章
- android asset中 zip包解压sdcard
- android源码编译出现No private recovery resources for TARGET_
- android IApplicationToken分析
- android学习资料与资源记录
- Android(安卓)面试题(经典)
- appt命令检测Apk信息的方法
- android通用适配器
- 〖Android〗arm-linux-androideabi-gdb报 libpython2.6.so.1.0:
- 使用googleMap获取api方法