Java 设置数组中给定单元格的值

Java 设置数组中给定单元格的值,java,arrays,java-native-interface,set,int,Java,Arrays,Java Native Interface,Set,Int,我从JVM获取arr int[],并希望在其中的指定索引处设置一个值, 像这样: jintArray arr; jint* ints = _env->GetIntArrayElements(arr, false); int newvalue = 4; _env->SetIntArrayRegion(ints, 3, 1, &newvalue); // this works inst[3] = newvalue; // this failed !!! arr.set(3,

我从JVM获取arr int[],并希望在其中的指定索引处设置一个值, 像这样:

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

_env->SetIntArrayRegion(ints, 3, 1, &newvalue); // this works
inst[3] = newvalue; // this failed !!!
arr.set(3, newvalue);
你能告诉我为什么第二次作业失败了吗??? 它应该可以工作并且速度更快(没有方法调用)

谢谢,
Luc

JIntArray本身不是一个基本数组,它只包含一个基本数组。要设置值,可以使用set(int index,int value)方法(有关更多详细信息,请参阅),也可以使用JIntArray toArray()方法获取数组,然后改用该数组

在您的上下文中,第一个方法如下所示:

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

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

正如Luc提到的,他正在谈论JNI。一般的答案是JVM的GC可能会在备份存储区中移动到一个数组中。类型jintArray只是一个typedef,它实际上只指示数组的句柄

如果要操作数组,必须使用
SetIntArrayRegion
,它将传递的指针复制到备份存储中

或者您可以使用
GetIntArrayElements
的组合,该组合将固定或复制阵列,然后是
releaseTarrayElements


因为jintArray不是一个合适的C数组,所以不能使用索引器操作符[]。

有问题的打字错误或代码?数组名为
ints
,而不是
inst
,与最后一行一样,用“this failed”注释。我的问题与JNI主题有关。这里我们讨论的是两种不同的软件。无论如何,谢谢。:)