我应该在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
,似乎没有内存泄漏 最佳答案
是的你应该。 GetIntArrayElements
可能已经创建了数据的副本,或者固定了数组,以避免垃圾收集器移动数据。除非您致电ReleaseIntArrayElements
,否则将无法撤消该操作。
另外,如果您认为GetIntArrayElements(javaArray, JNI_FALSE)
不会创建副本,则它是不正确的。GetIntArrayElements
的第二个参数是jboolean*
,而不是jboolean
。它是一个输出参数,在函数返回后,该参数将指向一个值,该值指示是否进行了复制。
在您的情况下,JNI_FALSE
恰好具有与NULL
相同的值,因此您实际上是在做GetIntArrayElements(javaArray, NULL)
-也就是说,“我对知道是否制作了副本不感兴趣”。