установка значения данной ячейки в jintArray - PullRequest
0 голосов
/ 25 мая 2011

Я получаю arr int [] от JVM и хочу установить в нем значение по указанному индексу, как это:

jintArray arr;
jint* ints = _env->GetIntArrayElements(arr, false);
int newvalue = 4;

_env->SetIntArrayRegion(ints, 3, 1, &newvalue); // this works
inst[3] = newvalue; // this failed !!!

Можете ли вы сказать мне, почему второе назначение не удается ??? Это должно работать и быть намного быстрее (без вызова метода).

Спасибо, Люк

Ответы [ 2 ]

0 голосов
/ 23 мая 2013

Как упоминал Люк, он говорит о JNI. Общий ответ заключается в том, что GC JVM может перемещаться по резервному хранилищу в массив. Тип jintArray - это просто определение типа, которое на самом деле указывает только дескриптор массива.

Если вы манипулируете массивом, вы должны либо использовать SetIntArrayRegion, который копирует переданный указатель в резервное хранилище,

ИЛИ вы можете использовать комбинацию GetIntArrayElements, которая будет закреплять или копировать массив, а затем ReleaseIntArrayElements.

Поскольку jintArray не является правильным массивом C, вы не можете использовать оператор индексатора [].

0 голосов
/ 27 мая 2011

JIntArray сам по себе не является примитивным массивом, он просто содержит примитивный массив.Чтобы установить значения, вы можете использовать метод set (int index, int value) (см. API для получения более подробной информации), или вы можете получить массив, используя метод JIntArray toArray (), и использовать этот массив вместо.

В вашем контексте первый метод будет выглядеть так:

arr.set(3, newvalue);
...