我应该在GetIntarrayElements之后致电ReleaseIntarrayElements吗?

 2023-01-19    321  

问题描述

我应该在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可能已经创建了数据的副本,或者将数组固定为避免垃圾收集器移动数据.在您致电ReleaseIntArrayElements.

之前,这不会被撤消


另外,如果您认为它不会创建副本,则GetIntArrayElements(javaArray, JNI_FALSE)是不正确的.
GetIntArrayElements的第二个参数是jboolean*,而不是jboolean.这是一个输出参数,在函数返回后,它将指向指示是否制作副本的值.
就您而言,JNI_FALSE恰好具有与NULL相同的值,因此您实际上是在做GetIntArrayElements(javaArray, NULL) – 也就制作” .

以上所述是小编给大家介绍的我应该在GetIntarrayElements之后致电ReleaseIntarrayElements吗?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25857.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。