JNI的数据类型和类型签名

JNI的数据类型跟Java一样,都分为基本数据类型和引用数据类型,基本类型主要有jboolean、jchar、jint等,学过java的都知道,就是在原来java的基本数据类型前添加了一个“j”,

JNI中的引用类型主要有类、对象和数组,他们和java中的引用类也差不多

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

类的签名很简单,他采用“L+包名+类名+;”的形式,只需要将其中的.替换为/就行了,比如java.lang.String,他的签名是Ljava/lang/String;,注意末尾的“;”也是签名的一部分

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


除了boolean和long外,其他的都是Java类型的首字母大写。之所以他们例外,是因为boolean和long都被占用了,B被byte占用,L表示类的签名;

如果是数组签名可能复杂些,他的签名是[+类型签名,比如int数组,他的类型为int,而int的签名为I,所以int数组的签名是[I,

同理:
char[]    [C

float[]    [F

double[]    [D

long[]    [J

String[]    [Ljava/lang/String;

Object[]    [Ljava/lang/Object;

方法签名为(参数类型签名)+返回值类型签名,比如boolean func1(int a,double b,int[] c),根据参数类型的签名连载一起是ID[I,整个方法的签名是(ID[I),加上返回值就是(ID[I)Z

int func1()  他的签名为()I

void func1(int i) 它的签名为(I)V
boolean func1(int a,String b,int[] c)  它的签名就是(ILjava/lang/String;[I)Z

以上就是JNI 的数据类型和类型签名,当JNI中调用Java上层的API的时候,在JNI的表现形式就是这个样子了。 

                        
原文链接:https://blog.csdn.net/anye_bbk/article/details/56049763

你可能感兴趣的:(jni)