#java #arrays #java-native-interface #set #int
#java #массивы #java-native-интерфейс #установить #int
Вопрос:
Я получаю arr int[] из JVM и хочу установить в нем значение с указанным индексом, вот так:
jintArray arr;
jint* ints = _env->GetIntArrayElements(arr, false);
int newvalue = 4;
_env->SetIntArrayRegion(ints, 3, 1, amp;newvalue); // this works
inst[3] = newvalue; // this failed !!!
Можете ли вы сказать мне, почему второе назначение завершается неудачей???
Это должно работать и быть намного быстрее (без вызова метода).
Спасибо, Люк
Комментарии:
1. Опечатка в вопросе или коде? Массив назван так,
ints
а неinst
как в последней строке, с пометкой «ошибка»
Ответ №1:
Как упоминал Люк, он говорит о JNI. Общий ответ заключается в том, что GC JVM может перемещаться по резервному хранилищу в массив. Тип jintArray — это просто typedef, который на самом деле указывает только дескриптор массива.
Если вы манипулируете массивом, вы должны либо использовать SetIntArrayRegion
, который копирует переданный указатель в резервное хранилище,
ИЛИ вы можете использовать комбинацию GetIntArrayElements
, которая закрепит или скопирует массив, за которым следует ReleaseIntArrayElements
.
Поскольку jintArray не является надлежащим массивом C, вы не можете использовать оператор индексации[].
Ответ №2:
JIntArray сам по себе не является примитивным массивом, он просто содержит примитивный массив. Для установки значений вы можете использовать метод set(int index, int value) (подробнее см. в API), или вы можете получить массив с помощью метода JIntArray toArray() и использовать этот массив вместо.
В вашем контексте первый метод будет выглядеть следующим образом:
arr.set(3, newvalue);
Комментарии:
1. Мой вопрос касался темы JNI. Здесь мы говорим о двух разных программах. В любом случае, спасибо. 🙂