Android JNI入门第三篇——jni头文件分析

Android JNI入门第三篇——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

大家好,我是讯享网,很高兴认识大家。

           一、 首先写了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、文件的前九行就不用说了,他们是CC++的头,应该很好理解。

          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 *, 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);

第一个是非static方法,第二个是static方法,不同点如上红色标记。其中的不同将在以后提到。

2、 privatefriendlyprotected以及public这些方法限制符不会在JNI的头文件中出现。这些访问修饰符只有在其它类

       使用这些方法时有效!JNI中不关心此修饰符!

 

/
* @author 张兴业
* 邮箱:xy-zhang#163.com
* android开发进阶群:
*
*/

小讯
上一篇 2025-02-26 16:04
下一篇 2025-02-24 23:25

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/36846.html