Java语言中的数组一般有两种:基本数据类型的数组和引用类型的数组。同样在JNI中也有这两种类型的数组。
Java中基本的数据类型有byte、short、int、long、float、double、char、boolean等8种基本数据类型,基本数据类型的数组就是这些基本数据类型的一维数组。
引用类型的数组是指数组元素非基本数据类型的数组,如二维数组,string数组等。
一、处理基本类型的数组
处理基本数组跟处理字符串类似,有相似的函数。
a)Get<TYPE>ArrayElements(<TYPE>Arrayarr , jboolean* iscopy);
这类函数可以把java基本类型的数组转换成C/C++中的数组,有两种处理方式,一是拷贝一份传回本地代码,二是把指向java数组的指针直接传回本地代码。处理完本地化的数组后,需要通过Release<TYPE>ArrayElements来释放数组。
b)Release<TYPE>ArrayElements(<TYPE>Array arr ,<TYPE>* array ,jint mode);
用这个函数可以选择如何处理Java跟C++的数组,是提交还是撤销等,内存释放还是不释放等。
mode可以取下面的值:
0——对java数组进行更新并释放C/C++数组,
JNI_COMMIT——对java数组进行更新但不释放C/C++的数组,
JNI_ABORT——对java的数组不更新,释放C/C++的数组。
c)GetPrimitiveArrayCritical (jarray arr , jboolean* isCopied);
ReleasePrimitiveArrayCritical ( jarray arr ,void* array ,jint mode);
这两个函数也是为了增加直接传回指向java数组的指针而加入的函数。同样的,也会有GetStringCritical的死锁的问题。
d)Get<TYPE>ArrayRegion(<TYPE>Array arr , jsize start ,jsize len , <TYPE>* buffer);
这个函数在C/C++中预先开辟一段内存,然后把java基本类型的数组拷贝到这段内存中,跟GetStringRegion原理类似。
e)Set<TYPE>ArrayRegion (<TYPE>Array arr , jsize start , jsize len , const <TYPE>* buffer);
把java基本类型的数组中的指定范围的元素用C/C++的数组中的元素来赋值。
f)<TYPE>ArrayNew<TYPE>Array (jsize sz);
用于创建指定长度的基本数据类型的数组。
二、处理引用类型数组( Object [ ] )
Jni没有提供直接把java对象类型数组直接转到C/C++中的函数,而是通过Get/SetObjectArrayElement这样的函数来对Java的Object[ ]数组进行操作。
a) jobject GetObjectArrayElement( jobjectArray array , jsize index );
b) void SetObjectArrayElement ( jobjectArrayarray ,jsize index , jobject val);
使用上述函数也不用释放任何资源。
c) NewObjectArray可以通过指定长度跟初始值来创建某个类的数组。
三、其他方法
一个能用于两种不同数组的函数:
jsize GetArrayLength(jarray array);
返回数组中元素的个数,该数组既可以是基本数据类型的数组也可以是对象的数组。