当起始地址不为零时,在调用SetByteArrayRegion时没有副本

时间:2016-10-31 15:18:02

标签: java java-native-interface

我正在尝试使用JNI将(非常大的)字节数组从C程序复制到我的主Java程序。

我使用以下代码:

JNIEXPORT void JNICALL Java_connectors_javaConnector_updateMap
(JNIEnv *env, jobject jo, jbyteArray byteArray)
{
nextmapping_map[11]=111;
int from = 0;
int size = 20;
  (*env)->SetByteArrayRegion(env, byteArray, from, size,nextmapping_map);
    printf("Copied chunk: %d -> %d\n", from, to);
}

我的观点是代码只有在from == 0时才能正常工作:如果我进入我的主程序并且我请求nextmapping_map的值,我会按预期得到111。 但是,如果from > 0(这是必要的,因为我的数组太大而无法一次复制),那么我得到nextmapping_map的错误值。

这种行为很奇怪......我做错了什么?

感谢任何提示!

1 个答案:

答案 0 :(得分:1)

传递给from的{​​{1}}参数是java数组的索引。它不是C数组的索引。

例如,让C数组SetByteArrayRegion

a

和java { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } 初始化为全部42:

byteArray

然后{ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, ... 将数组SetByteArrayRegion(env, byteArray, 3, 4, a)中的4个元素从索引a开始复制到0位置索引byteArray3中的结果为:

byteArray

当需要将区域从C数组复制到java数组并保留索引时,必须将偏移量添加到C数组的开头:

{ 42, 42, 42, 0, 1, 2, 3, 42, 42, 42, 42, 42, ...