Мне нужно вызвать ReleaseIntArrayElements в массиве, созданном с помощью NewIntArray?

У меня есть собственный метод, который выполняет некоторую работу над растровым изображением. Внутри метода я беру данные изображения через вызов метода, который записывает данные в параметр jintArray, который я создал с помощью NewIntArray:

jintArray pixels = env->NewIntArray(width * height);

Мне не нужно возвращать этот массив обратно к вызывающему Java-коду - он только для обработки в этом методе. Нужно ли мне называть ReleaseIntArrayElements на pixels? Если да, то что я передаю для параметра elems, так как мне не нужно копировать его обратно в массив Java?

void (JNICALL *ReleaseIntArrayElements) (JNIEnv *env, jintArray array, jint *elems, jint mode);

Ответ 1

Вам не нужно ничего с этим делать. Это локальная ссылка, и она будет очищена, когда выйдет JNI-метод. Как намекает выше Эдвард Томпсон, ReleaseIntArrayElements() является обратным символом GetIntArrayElements(). Он не имеет другой функции.

Ответ 2

Вы должны опубликовать только ссылку:

jintArray pixels = env->NewIntArray(width * height);
...
env->DeleteLocalRef(pixels)

Ответ 3

Хотя @user207421 правильно, вам не нужно env->DeleteLocalRef() в env->DeleteLocalRef() случаев, но, безусловно, есть случаи, когда это необходимо. Одним из примеров этого является использование JNI в менее распространенном направлении вызова JNI из C/C++ для использования кода на Java, а не использования его для вызова методов C/C++ из java. Я нашел трудный путь и испытывал большие утечки памяти в моей программе C++, пока не прочитал ответ @gerbit и не использовал env->DeleteLocalRef() и все утечки памяти исчезли. Для более конкретного примера, где использование env->DeleteLocalRef() абсолютно необходимо, см. Мой вопрос в качестве ссылки.