2013-04-02 19 views
3

以下代码为jni创建java数组的int数组, 为什么我们需要创建一个temp []数组,为什么我们不能只填充结果[]数组并将其返回给java。是否因为java和jni应该使用不同的内存空间,因此两个不同的指针?如果是这样,那么目的是什么?谢谢为什么需要创建一个用于将数组从jni返回给java的临时数组

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; 
} 

回答

2

原因是,你不能直接修改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为基本类型(布尔型,短型,字符型,字节型,整型,长型,浮点型,双精度型)定义了九种类型的数组8,另一种用于对象。

参考:

Get< PrimitiveType>ArrayElements Routines

Java Programming Tutorial Java Native Interface

Accessing Java Arrays

+0

在你的榜样,什么是env-> GetIntArrayElements(输入,NULL)究竟回报?内存中输入的地址?如果是这样,inputArray和输入应该是完全相同的元素? – henryyao

+0

该方法有一个错字,但我修复了它。它返回的是指向数组元素的指针(如果失败,则返回null)。 'input',使用'GetIntArrayElements'存储指向'inputArray'的指针,您可以获取该指针或根据最后一个参数(true/false)创建一个副本。它与“输入”不同。 –

相关问题