JNI编程入门(三): 数据类型对应关系简介

本篇博客重点研究java层与C++层之间注册函数数据类型之间的关系,例如:

public native int get_key_code();

jint get_key_code(JNIEnv *, jobject);

为什么java层的返回值为int,而C++层的返回值则为jint呢?

在Java语言中数据类型分为基本数据类型和引用类型。

其中基本数据类型有8种:byte、char、short、int、long、float、double、boolean。

8种基本数据类型分别相应JNI数据类型中的jbyte、jchar、jshort、jint、jlong、jfloat、jdouble、jboolean。

除了基本数据类型外其他都是引用类型:Object、String、数组等。

全部的JNI引用类型全部是jobject类型,为了使用方便和类型安全,JNI定义了一个引用类型集合。

基本数据类型:

JNI编程入门(三): 数据类型对应关系简介

引用类型:

JNI编程入门(三): 数据类型对应关系简介

集合其中的全部类型都是jobject的子类,这些子类和Java中经常使用的引用类型相相应。

jstring:    字符串

jclass:     class字节码对象

jthrowable: 异常

jarray:    数组,注意:jarray派生了8个子类,分别与Java中的8种引用类型(jintArray、jshortArray、jlongArray等)相对应。

所以下面这个示例,大家就应该可以看清其对应关系。

//native.class

public static native void test(short s, int i, long l, float f, double d, char c,

       boolean z, byte b, String str, Object obj, MyClass p);

//native.h

JNIEXPORT void JNICALL Java_com_study_jnilearn_HelloWorld_test(JNIEnv *, jclass, jshort, jint, jlong, jfloat, jdouble, jchar,

       jboolean, jbyte, jstring, jobject, jobject, jintArray);

 

域描述符

1) : 基本类型的描述符已经被定义好了,如下表所示:

JNI编程入门(三): 数据类型对应关系简介

2): 引用类型的描述符

对于一维数组,其为 :  [ + 其类型的域描述符 + ;

多维数组则是 n个[ +该类型的域描述符 , N代表的是几维数组

引用类型则为 L + 该类型类描述符 + ;   (注意,这儿的分号“;”是JNI的一部分)

例如:

String类型的域描述符为 Ljava/lang/String; 

int[ ]       其描述符为[I

float[ ]    其描述符为[F

String[ ]  其描述符为[Ljava/lang/String;

Object[ ] 其描述符为[Ljava/lang/Object;

多维数组:

int  [ ][ ] 其描述符为[[I

float[ ][ ] 其描述符为[[F

3): 方法描述符

将参数类型的域描述符按照申明顺序放入一对括号中后跟返回值类型的域描述符,规则如下: (参数的域描述符的叠加)返回

JNI编程入门(三): 数据类型对应关系简介