美文网首页
JNI开发:Jni数据类型和构造方法父类的访问

JNI开发:Jni数据类型和构造方法父类的访问

作者: slds | 来源:发表于2017-06-19 21:11 被阅读0次

    JNI数据类型
    基本数据
    Java基本数据类型与JNI数据类型的映射关系

    Java类型->JNI类型->C类型
    

    JNI的基本数据类型有(左边是Java,右边是JNI):

    boolean             jboolean
    byte                 jbyte
    char                 jchar
    short                 jshort
    int                 jint
    long                 jlong
    float                 jfloat
    double                 jdouble
    void                 void
    

    引用类型(对象)

    String                 jstring
    Object                 jobject
    
    数组,基本数据类型的数组
    byte[]                jByteArray
    对象数组
    object[](String[])     
    

    native函数参数说明

    每个native函数,都至少有两个参数(JNIEnv*,jclass或者jobject)。
    1)当native方法为静态方法时:
    jclass 代表native方法所属类的class对象(JniTest.class)。
    2)当native方法为非静态方法时:
    jobject 代表native方法所属的对象。
    native函数的头文件可以自己写。

    关于属性与方法的签名

    一、属性的签名
    属性的签名其实就是属性的类型的简称,对应关系如下:

    image.png

    尤其注意的是,类的签名格式就是:

    L完整包名;
    

    其中完整包名用 / 代替.
    末尾的 ; 不能省略
    数组的签名就是:

    [类型签名
    

    其中,多为数组就用多个[

    二、方法的签名
    获取方法的签名比较麻烦一些,通过下面的方法也可以拿到属性的签名。
    打开命令行,

    javap -s -p 完整类名
    

    我们通过as的terminal工具进入到F:\MyApplication\app\build\intermediates\classes\debug>,然后输入命令:

     javap -s -p com.example.gyf.GyfJniTest
    
    public class com.example.gyf.GyfJniTest {
      public java.lang.String name;
        descriptor: Ljava/lang/String;
      public static int NUM;
        descriptor: I
      public com.example.gyf.GyfJniTest();
        descriptor: ()V
    
      public int getAdminName(int);
        descriptor: (I)I
    
      public static java.lang.String getUUID();
        descriptor: ()Ljava/lang/String;
    
      public native java.lang.String getNameFromC();
        descriptor: ()Ljava/lang/String;
    
      public native void getStaticNameFormC();
        descriptor: ()V
    
      public native int getMethodFromC();
        descriptor: ()I
    
      public native java.lang.String getStaticMethodFromC();
        descriptor: ()Ljava/lang/String;
    
      public native long accessConstructor();
        descriptor: ()J
    
      static {};
        descriptor: ()V
    }
    

    其中,descriptor就是我们需要的签名了,注意签名中末尾的分号不能省略。
    方法签名的规律就是,括号不可以省略:

    (参数类型签名)返回值类型签名
    

    构造方法和父类的访问:
    github地址:https://github.com/momoshusheng/baseJni

    相关文章

      网友评论

          本文标题:JNI开发:Jni数据类型和构造方法父类的访问

          本文链接:https://www.haomeiwen.com/subject/bosnqxtx.html