我正在尝试使用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
的错误值。
这种行为很奇怪......我做错了什么?
感谢任何提示!
答案 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
位置索引byteArray
。 3
中的结果为:
byteArray
当需要将区域从C数组复制到java数组并保留索引时,必须将偏移量添加到C数组的开头:
{ 42, 42, 42, 0, 1, 2, 3, 42, 42, 42, 42, 42, ...