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[] 数组进行操作。