设置 jintArray 中给定单元格的值

发布于 2024-11-09 17:53:34 字数 338 浏览 5 评论 0原文

我从 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

丑疤怪 2024-11-16 17:53:34

正如 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 by ReleaseIntArrayElements.

Since jintArray is not a proper C array, you cannot use the indexer operator[].

落叶缤纷 2024-11-16 17:53:34

JIntArray 本身不是一个原始数组,它只是包含一个原始数组。要设置值,您可以使用 set(int index, int value) 方法(请参阅 API 了解更多详细信息),或者您可以使用 JIntArray toArray() 方法获取数组,然后使用该数组。

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

arr.set(3, newvalue);

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:

arr.set(3, newvalue);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文