1. 数组的分类
- 数组分为两种
- 根本数据类型的数组
- 对象类型(Object[])的数组
- 一个能通用于两种不同数据类型数组的函数
GetArrayLength( jarray array);//获取长度
2. 根本数据类型数组
- 解决根本数据类型数组的时候,也是跟解决字符串类型,有很类似的函数
Get<TYPE>ArrayElements( <TYPE>Array arr, jboolean* isCopied);
这类函数能够把Java根本类型的数组转换到C/C++的数组,有两种解决形式,一是拷贝一份传回本地代码,另一个是把指向Java数组的指针间接传回到本地代码。解决完本地的数组后,通过Release<TYPE>ArrayElements来开释数组。
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++的数组
- JDK 1.2 为了减少间接传回指向 Java 数组的指针,而减少了以下函数。然而同样的,也会有同GetStringCritical的死锁问题
GetPrimitiveArrayCritical( jarray arr, jboolan* isCopied);ReleasePrimitiveArrayCritical(jarray arr, void array, jint mode);
- 在C/C++事后开拓一块内存,而后把Java根本数组类型的数组拷贝到这块内存当中。跟GetStringRegion原理类似
Get<TYPE>ArrayRegion( <TYPE>Array arr, jsize, start, jsize len, <TYPE>* buffer);
- 把Java根本数据类型的数组中的指定范畴的元素用 C/C++的数组中的元素来赋值
Set<TYPE>ArrayRegion( <TYPE>Array arr, jsize start, jsize len, const <TYPE>* buffer );
- 指定一个长度,而后返回相应Java根本类型的数组
<TYPE>Array New<TYPE>Array( jsize len );
3. 对象类型数组
Object[]
JNI 没有提供间接把Java的对象类型数组( Object[] )间接转到 C/C++ 的 jobject[] 数组的函数。而是间接通过GetObjectArrayElement /SetObjectArrayElement 这样的函数来对Java的Object[]数组进行操作。