Мне нужно вызвать 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()
абсолютно необходимо, см. Мой вопрос в качестве ссылки.