ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
### 14.3 JNI的数据类型和类型签名 JNI的数据类型包含两种:基本类型和引用类型。基本类型主要有jboolean、jchar、jint等,它们和Java中的数据类型的对应关系如表14-1所示。 :-: 表14-1 JNI基本数据类型的对应关系 ![](https://img.kancloud.cn/64/2f/642faf34707b81caa8c652be16864c10_1351x512.png) JNI中的引用类型主要有类、对象和数组,它们和Java中的引用类型的对应关系如表14-2所示。 :-: 表14-2 JNI引用类型的对应关系 ![](https://img.kancloud.cn/22/f6/22f6fd95d5712af3420a9d14daef1475_1069x630.png) JNI的类型签名标识了一个特定的Java类型,这个类型既可以是类和方法,也可以是数据类型。 类的签名比较简单,它采用“L+包名+类名+; ”的形式,只需要将其中的.替换为/即可。比如java.lang.String,它的签名为Ljava/lang/String;,注意末尾的;也是签名的一部分。 基本数据类型的签名采用一系列大写字母来表示,如表14-3所示。 :-: 表14-3 基本数据类型的签名 ![](https://img.kancloud.cn/67/3e/673e35eb16d63714211816c3b4465f8f_1348x295.png) 从表14-3可以看出,基本数据类型的签名是有规律的,一般为首字母的大写,但是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