我应该在 GetIntArrayElements 之后调用 ReleaseIntArrayElements 吗?
Should I call ReleaseIntArrayElements after GetIntArrayElements?
我应该在 GetIntArrayElements
之后调用 ReleaseIntArrayElements
吗?
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
。它是一个输出参数,在函数 returns 之后将指向一个值,指示是否进行了复制。
在你的例子中,JNI_FALSE
恰好与 NULL
具有相同的值,所以你实际上是在做 GetIntArrayElements(javaArray, NULL)
- 即 "I'm not interested in knowing whether or not a copy was made".
我应该在 GetIntArrayElements
之后调用 ReleaseIntArrayElements
吗?
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
。它是一个输出参数,在函数 returns 之后将指向一个值,指示是否进行了复制。
在你的例子中,JNI_FALSE
恰好与 NULL
具有相同的值,所以你实际上是在做 GetIntArrayElements(javaArray, NULL)
- 即 "I'm not interested in knowing whether or not a copy was made".