在Java Native Interface (JNI)中,返回数组给Java是一个常见的操作,特别是在C/C++代码需要将数据传递回Java层时。下面将详细介绍如何在JNI中创建、填充和返回数组给Java。
1. 创建数组
在JNI中,所有数组类型都通过jarray指针来表示。以下是如何创建不同类型的数组:
1.1 创建基本类型数组
jarray createArray(JNIEnv *env, jsize length, jarrayClassID clazz) {
return (*env)->NewArray(env, clazz, length);
}
env:指向JNI环境的指针。length:数组的长度。clazz:数组的类ID。
1.2 创建对象数组
jarray createObjectArray(JNIEnv *env, jsize length, jarrayClassID clazz) {
jarray array = (*env)->NewObjectArray(env, length, clazz, NULL);
return array;
}
1.3 创建多维数组
jarray createMultiDimArray(JNIEnv *env, jsize dim1, jsize dim2, jarrayClassID clazz) {
jarray array = (*env)->NewMultiDimArray(env, clazz, dim1, dim2);
return array;
}
2. 设置数组元素
在创建数组后,您需要设置数组的元素。以下是如何设置不同类型的数组元素:
2.1 设置基本类型数组元素
void setIntArray(JNIEnv *env, jarray array, jsize index, jint value) {
(*env)->SetIntArrayRegion(env, array, index, 1, &value);
}
void setFloatArray(JNIEnv *env, jarray array, jsize index, jfloat value) {
(*env)->SetFloatArrayRegion(env, array, index, 1, &value);
}
2.2 设置对象数组元素
void setObjectArrayElement(JNIEnv *env, jarray array, jsize index, jobject element) {
(*env)->SetObjectArrayElement(env, array, index, element);
}
2.3 设置多维数组元素
void setMultiDimArrayElement(JNIEnv *env, jarray array, jsize index1, jsize index2, jobject element) {
jarray subArray = (*env)->GetObjectArrayElement(env, array, index1);
(*env)->SetObjectArrayElement(env, subArray, index2, element);
}
3. 返回数组给Java
在设置完数组元素后,您可以通过JNI函数将数组返回给Java:
jobject getArray(JNIEnv *env, jarray array) {
return array;
}
4. 示例
以下是一个简单的示例,展示如何在JNI中创建、填充和返回一个整型数组给Java:
#include <jni.h>
JNIEXPORT jobject JNICALL Java_MyClass_createIntArray(JNIEnv *env, jobject thiz, jint length) {
jarray array = createArray(env, length, env->FindClass(env, "java/lang/Integer"));
for (jsize i = 0; i < length; i++) {
setIntArray(env, array, i, i * 2);
}
return getArray(env, array);
}
在这个示例中,我们创建了一个长度为length的整型数组,并填充了数组元素。最后,我们将数组返回给Java。
总结
在JNI中返回数组给Java是一个相对简单的操作,但需要注意数组的创建、设置和返回过程。通过遵循上述步骤,您可以轻松地在C/C++代码中创建和返回数组给Java。
