关于c:5JNI-操作数组

42次阅读

共计 1167 个字符,预计需要花费 3 分钟才能阅读完成。

1. 数组的分类

  • 数组分为两种
  1. 根本数据类型的数组
  2. 对象类型(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 能够取上面的值:

  1. 0 对 Java 的数组进行更新,并开释 C/C++ 的数组
  2. JNI_COMMIT 对 Java 的数组进行更新,然而不开释 C /C++ 的数组
  3. 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[] 数组进行操作。

正文完
 0