对于以下从jni为java创建int数组的代码, 为什么我们需要创建一个temp []数组,为什么我们不能只填充result []数组并将其返回给java。是因为java和jni应该使用不同的内存空间,因此有两个不同的指针?如果是这样,那是什么目的?感谢
JNIEXPORT jintArray JNICALL Java_ArrayTest_initIntArray(JNIEnv *env, jclass cls, int size)
{
jintArray result;
result = (*env)->NewIntArray(env, size);
if (result == NULL) {
return NULL; /* out of memory error thrown */
}
int i;
// fill a temp structure to use to populate the java int array
jint temp[256];
for (i = 0; i < size; i++) {
temp[i] = 0; // put whatever logic you want to populate the values here.
}
// move from the temp structure to the java structure
(*env)->SetIntArrayRegion(env, result, 0, size, temp);
return result;
}
答案 0 :(得分:3)
原因是你不能直接修改jinitArray中的对象,因为它们是Java对象而不是C对象。
在您的示例中,您将创建一个C的数组,并将其移动到Java结构。在更改数组内容时必须遵守相同的方法。您需要一个提供C阵列的访问器。
如何使用JNI修改数组的示例。
JNIEXPORT jintArray JNICALL Java_SendArray_loadFile(JNIEnv *env, jobject obj, jintArray input) {
// Convert incoming JNI jinitarray to C's native jint[]
jint *inputArray = env->GetIntArrayElements(env, input, NULL); // if last param JNI_TRUE, then a copy is returned.
if(NULL == inputArray) {
return NULL ;
}
const jsize length = env->GetArrayLength(input);
for (int i = 0; i < length; i++) {
inputArray[n] = 0; //We can operate on native jinit[] elements.
}
// Convert the C's native jinit[] int JNI jinitarray
env->ReleaseIntArrayElements(env, input, inputArray, 0); // 0 - copy back the content and free the `input` buffer
return inputArray;
}
原因在于Java数组是类似于类的引用类型。这就是您需要在JNI数组和本机数组之间进行转换的原因。
注意: 提出的示例请参考int类型。 JNI为原始类型(boolean,short,char,byte,int,long,float,double)定义了九种类型的数组8,另一种为Object。
参考:
Get< PrimitiveType>ArrayElements Routines