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