设置 jintArray 中给定单元格的值
我从 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 !!!
你能告诉我为什么第二次作业失败吗??? 它应该可以工作并且速度更快(没有方法调用)。
谢谢, 吕克
I get the arr int[] from the JVM and want to set a value in it at a specified index,
like this:
jintArray arr;
jint* ints = _env->GetIntArrayElements(arr, false);
int newvalue = 4;
_env->SetIntArrayRegion(ints, 3, 1, &newvalue); // this works
inst[3] = newvalue; // this failed !!!
Can you tell me why the second assignment fails???
It should work and be much faster (no method call).
Thanks,
Luc
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
正如 Luc 提到的,他正在谈论 JNI。一般的答案是,JVM 的 GC 可能会将后备存储移动到数组。 jintArray 类型只是一个 typedef,它实际上只指示数组的句柄。
如果您要操作数组,则必须使用
SetIntArrayRegion
,它将传递的指针复制到后备存储中,或者您可以使用
GetIntArrayElements
的组合,它将固定 < em>或复制数组,然后是ReleaseIntArrayElements
。由于 jintArray 不是正确的 C 数组,因此不能使用索引器运算符 []。
As Luc mentioned, he is talking about JNI. The general answer is that the JVM's GC may move around the backing store to an array. The type jintArray is just a typedef which really only indicates a handle to an array.
If you are manipulating the array, you must either use
SetIntArrayRegion
, which copies the passed pointer into the backing store,OR you can use a combination of
GetIntArrayElements
, which will pin or copy the array, followed byReleaseIntArrayElements
.Since jintArray is not a proper C array, you cannot use the indexer operator[].
JIntArray 本身不是一个原始数组,它只是包含一个原始数组。要设置值,您可以使用 set(int index, int value) 方法(请参阅 API 了解更多详细信息),或者您可以使用 JIntArray toArray() 方法获取数组,然后使用该数组。
在您的上下文中,第一个方法如下所示:
JIntArray is itself not a primitive array, it just contains a primitive array. To set values, you can use the set(int index, int value) method (see API for more details), or you can get the array using the JIntArray toArray() method, and use that array instead.
In your context, the first method would look like this: