Должен ли я вызвать ReleaseIntArrayElements после GetIntArrayElements? - PullRequest
0 голосов
/ 04 июня 2019

Должен ли я позвонить 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 Ответ

1 голос
/ 04 июня 2019

Да, вы должны. GetIntArrayElements, возможно, создал копию данных или закрепил массив, чтобы избежать перемещения данных сборщиком мусора. Это не будет отменено, пока вы не позвоните ReleaseIntArrayElements.


Кроме того, GetIntArrayElements(javaArray, JNI_FALSE) неверно, если вы думали, что он не будет создавать копию.
Второй аргумент GetIntArrayElements - это jboolean*, а не jboolean. Это выходной параметр, который после возврата функции будет указывать на значение, указывающее, была ли сделана копия.
В вашем случае JNI_FALSE так же имеет то же значение, что и NULL, так что вы, по сути, делаете GetIntArrayElements(javaArray, NULL) - то есть "Мне не интересно знать, была ли копия сделал ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...