установка значения заданной ячейки в jintArray

#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. Здесь мы говорим о двух разных программах. В любом случае, спасибо. 🙂