zoukankan      html  css  js  c++  java
  • 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,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开发进阶群:278401545
    *
    */

  • 相关阅读:
    Spring boot MultipartResolver
    shell 脚本中的当前工作目录等于执行脚本时所在的工作目录
    IDEA Exception in thread "main" java.lang.ClassNotFoundException: com.streamax.servicecore.business.FileManageServApplication
    java学习路线图-----java基础学习路线图(J2SE学习路线图)
    Java基本语法-----java数组(一维数组二维数组)
    Java基本语法-----java二维数组
    Java基本语法-----java函数
    程序员的自我修养-----Java开发的必须知道的几个注意点
    JAVA面向对象-----java面向对象的六大原则
    Java集合-----java集合框架常见问题
  • 原文地址:https://www.cnblogs.com/xyzlmn/p/3168151.html
Copyright © 2011-2022 走看看