Java 起始地址不为零时调用SetByteArrayRegion时不复制

Java 起始地址不为零时调用SetByteArrayRegion时不复制,java,java-native-interface,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(en

我试图使用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\u map
的值,我会得到预期的111。 但是,如果
from>0
(这是必要的,因为我的数组太大,无法一次复制),那么我会为
nextmapping\u map
获取错误的值


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

传递给
SetByteArrayRegion
from
参数是java数组的索引。它不是C数组的索引

例如,让C数组
a

{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
java
byteArray
初始化为所有42个:

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

{ 42, 42, 42, 0, 1, 2, 3, 42, 42, 42, 42, 42, ...
当需要将区域从C数组复制到java数组并保留索引时,需要在C数组的开头添加偏移量:

SetByteArrayRegion(env, byteArray, from, size, a + from);

您将使用哪个值作为
中的,设置下一个映射图的哪个索引,以及您试图从中读取的bytearray的哪个索引?偏移量只进入bytearray,而不是本机缓冲区。这是误会吗?您可能需要将
nextmapping\u map+作为最后一个参数传递给
,但不清楚您期望的行为。请定义“数组太大,无法一次复制”。为什么?合同中没有规定限制。