【问题标题】:setting the value of a given cell in a jintArray在 jintArray 中设置给定单元格的值
【发布时间】:2011-05-25 08:37:27
【问题描述】:

我从 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 !!!

你能告诉我为什么第二个任务失败了吗??? 它应该可以工作并且速度更快(没有方法调用)。

谢谢, 卢克

【问题讨论】:

  • 有问题或代码的错字?该数组被命名为ints 而不是inst 最后一行,注释为“this failed”

标签: java arrays java-native-interface set int


【解决方案1】:

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

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

或者您可以使用GetIntArrayElements 的组合,这将固定或复制数组,然后是ReleaseIntArrayElements

由于 jintArray 不是正确的 C 数组,因此不能使用索引器 operator[]。

【讨论】:

    【解决方案2】:

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

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

    arr.set(3, newvalue);
    

    【讨论】:

    • 我的问题与 JNI 主题有关。我们在这里谈论两种不同的软件。不管怎么说,还是要谢谢你。 :)
    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多