0%

JNI 和 NDK 编程(三):JNI 的数据类型和类型签名

1. JNI 基本数据类型和 Java 的对应关系

JNI 类型 Java 类型 描述
jboolean boolean 无符号 8 位整数
jbyte byte 有符号 8 位整数
jchar char 无符号 16 位整数
jshort short 有符号 16 位整数
jint int 32 位整数
jlong long 64 位整数
jfloat float 32 位浮点型
jdouble double 64 位浮点型
void void 无类型

2. JNI 引用类型和 Java 的对应关系

JNI 类型 Java 类型 描述
jobject Object Object 类型
jclass Class Class 类型
jstring String 字符串
jobjectArray Object[] 对象数组
jbooleanArray boolean[] boolean 数组
jbyteArray byte[] byte 数组
jcharArray char[] char 数组
jshortArray short[] short 数组
jintArray int[] int 数组
jlongArray long[] long 数组
jfloatArray float[] float 数组
jdoubleArray double[] double 数组
jthrowable Throwable Throwable

3. JNI 类型签名概述

  • JNI 的类型签名标识了一个特定的 Java 类型,这个类型既可以是方法,也可以是数据类型

  • 类的签名:采用 L+包名+类名+; 的形式,只需要将其中的 . 替换为 / 即可。比如,java.lang.String 的签名为 Ljava/lang/String;

  • 基本数据类型签名:采用一系列大写字母来表示

    Java 类型 签名
    boolean Z
    byte B
    char C
    short S
    int I
    long J
    float F
    double D
    void V
    • 基本数据类型的签名是有规律的,一般为首字母的大写。但是 boolean 的除外,因为 B 已经被 byte 占用了。long 的签名之所以不是 L,是因为 L 表示的是类的签名
  • 对象和数组的签名

    • 对象:对象的签名就是对象所属的类的签名。比如 String 对象,它的签名为 Ljava/lang/String;

    • 数组:数组的签名为 [+数组元素的类型签名。比如 int 数组,其数组元素类型为 int,而 int 的签名是 I,所以 int 数组的签名就是 [I。同理可得如下签名对应关系

      类型数组 签名
      char[] [C
      float[] [F
      double[] [D
      long[] [J
      String[] [Ljava/lang/String;
      Object[] [Ljava/lang/Object;
      • 对于多维数组来说,它的签名为 n 个 [+类型签名,其中 n 表示数组的维度。比如,int[][] 的签名为 [[I,其他情况可以此类推
  • 方法签名:方法的签名为 (参数类型签名)+返回值类型签名。比如,boolean fun1(int a, double b, int[] c),根据签名的规则可以知道,它的参数类型的签名连在一起是 ID[I,返回值类型的签名为 Z,所以整个方法的签名就是 (ID[I)Z。示例:

    • boolean fun1(int a, String b, int[] c) 的签名是:(ILjava/lang/String;[I)Z
    • int fun1() 的签名是:()I
    • void fun1(int i) 的签名是:(I)V
-------------------- 本文结束感谢您的阅读 --------------------