JNI 数组传递与异常处理
JNI 通过 JNIEnv 提供的操作 Java 数组的功能。它提供了两个函数:一个是操作 java 的简单型数组的,另一个是操作对象类型
数组的。
因为速度的原因,简单类型的数组作为指向本地类型的指针暴露给本地代码。因此,它们能作为常规的数组存取。这个指针是
指向实际的 Java 数组或者 Java 数组的拷贝的指针。另外,数组的布置保证匹配本地类型。
为了存取 Java 简单类型的数组,你就要要使用 GetXXXArrayElements 函数(见表 A),XXX 代表了数组的类型。这个函数把 Java
数组看成参数,返回一个指向对应的本地类型的数组的指针。
表 A
函数
Java 数组类
型
本地类型
GetBooleanArrayElements
jbooleanArray
jboolean
GetByteArrayElements
jbyteArray
jbyte
GetCharArrayElements
jcharArray
jchar
GetShortArrayElements
jshortArray
jshort
GetIntArrayElements
jintArray
jint
GetLongArrayElements
jlongArray
jlong
GetFloatArrayElements
jfloatArray
jfloat
GetDoubleArrayElements
jdoubleArray
jdouble
JNI 数组存取函数
当你对数组的存取完成后,要确保调用相应的 ReleaseXXXArrayElements 函数,参数是对应 Java 数组和 GetXXXArrayElements
返回的指针。如果必要的话,这个释放函数会复制你做的任何变化(这样它们就反射到 java 数组),然后释放所有相关的资源。
为了使用 java 对象的数组,你必须使用 GetObjectArrayElement 函数和 SetObjectArrayElement 函数,分别去 get,set 数组
的元素。GetArrayLength 函数会返回数组的长度。
下面通过一个实际的例子,演示一下在 JAVA 中传递基本类型的数组与对象类型的数组,然后在 C++中进行相应的处理。
数组传递:
JAVA 中的代码:
package com.cjz.ibm;
public class CopyArray {
static int totalsum = 0;
static int a[] = new int[] { 1, 2, 3, 4, 5 };