我应该在GetIntArrayElements之后调用ReleaseIntArrayElements吗?

时间:2019-06-04 07:31:52

标签: java java-native-interface

我应该在ReleaseIntArrayElements之后打给GetIntArrayElements吗?

JNIEXPORT void JNICALL Java_com_test_Example_func
        (JNIEnv *env, jobject jobj, jintArray javaArray) {
    jint *array = env->GetIntArrayElements(javaArray, JNI_FALSE);

    // do something with array        

    // is it necessarily to call ReleaseIntArrayElements in the end?
    //env->ReleaseIntArrayElements(javaArray, array, JNI_ABORT);
}

如果我不打ReleaseIntArrayElements

,似乎没有内存泄漏

1 个答案:

答案 0 :(得分:1)

是的,你应该。 GetIntArrayElements可能已经创建了数据的副本,或者固定了数组以避免垃圾收集器移动数据。在您致电ReleaseIntArrayElements之前,该操作将无法撤消。


此外,如果您认为GetIntArrayElements(javaArray, JNI_FALSE)不会创建副本,则它是不正确的。
GetIntArrayElements的第二个参数是jboolean*,而不是jboolean。它是一个输出参数,在函数返回后,它将指向一个值,该值指示是否进行了复制。
在您的情况下,JNI_FALSE恰好具有与NULL相同的值,因此您实际上是在进行GetIntArrayElements(javaArray, NULL)-也就是说,“我对了解是否制作了副本”。