打通了连接Java世界和native世界的通道之后,摆在我们面前的问题,就变为了,如何在native code中,来操作Java object呢?Java object可以分为如下3种:
Java Language的基本数据类型,或称为原始数据类型
Java Language中内置的引用数据类型,如String,基本数据类型的数组
非Java Language内置的引用数据类型
Java Language的基本数据类型,与C/C++中的那些基本数据类型并无太大的差别,无论是作为参数传递,还是要作为返回值。因而此处,对于Java Language的基本数据类型就不再多做描述。下面主要说明一下在native code中访问Java Language中内置的引用数据类型和非Java Language内置的引用数据类型。
Java Language中内置的引用数据类型
Java Language中内置的引用数据类型,又主要包括String和原始数据类型的数组。
String
首先来看String。String所对应的native 类型为jstring。jstring既不同于C风格的一‘\0’结尾的char *的string,也不同于C++标准库中的string类型。我们不能像操作C风格的string那样来操作jstring,而必须首先经过JNI函数的转换,转换为UTF-16编码的jchar array或者UTF-8编码的char array之后,再来做操作。JNI有专门提供一组函数来来完成这样的转换。这组函数如下:
可以看到这组函数大体上可以分为两个族,String*的那一族用于操作UTF-16的字串串,如将jstring转换为UTF-16编码的jchar 数组,获取jchar数组长度等;而StringUTF*的那一族,则用于操作UTF-8的字串。