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

来源:互联网 发布:excel数据条渐变填充 编辑:程序博客网 时间:2024/05/21 22:30

           一、 首先写了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 __cplusplusextern "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开发进阶群:278401545
*
*/

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 gta5任务完成后卡了怎么办 gta5车被扣押了怎么办 侠盗猎车手5卡怎么办 英雄联盟转区后没法快捷施法怎么办 欠太多人的钱怎么办 我欠了很多钱怎么办 输了那么多钱我该怎么办 家里欠了钱我该怎么办 欠了好多钱我该怎么办 赌球输了好几千怎么办 欠信用卡的人死了怎么办 欠别人钱人死了怎么办 别人欠我钱人死了怎么办 美国生娃孩子怎么办医保 黑在美国病了怎么办 在外打工房租太贵怎么办 在外面打工房租租不起怎么办 买车型号错了怎么办 沃出行不退押金怎么办 钢铁雄心4人力0怎么办 钢铁雄心4没工厂怎么办 钢铁雄心4锁区怎么办 qq超市金币满了怎么办 旋转轮胎2车翻了怎么办 轮胎里面卡进小石子应该怎么办 手游吃鸡模拟器已经到达上限怎么办 逆战场手游模拟器黑屏怎么办 欧洲卡车2翻车了怎么办 卧式注塑机锁模久了打不开怎么办 欧洲卡车2困了怎么办 欧卡2没油了怎么办 欧卡2车卡住了怎么办 欧卡2车子卡住了怎么办 做题手感变差怎么办 吃鸡游戏掉帧怎么办 买了俄区游戏怎么办 战地1子弹用完了怎么办 1kb彩信点开了怎么办 玩地球末日卡顿怎么办 电脑显示不亮了怎么办 电脑玩游戏显卡停止运行怎么办