JNIを使用してCプログラムからメインJavaプログラムに(非常に大きな)バイト配列をコピーしようとしています。開始アドレスがゼロでないときにSetByteArrayRegionを呼び出すときにコピーがありません
私は、次のコードを使用しています:
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
の値が間違っています。
この動作は非常に奇妙です...私は何か間違っていますか?
ありがとうございました!
'from'にどの値を使用していますか、nextmapping_mapのインデックスはどのように設定しますか、どのバイトインデックスから読み込もうとしていますか?オフセットは、ネイティブバッファではなく、バイト配列内にのみあります。それは誤解ですか?最後のパラメータとして 'nextmapping_map + from'を渡す必要があるかもしれませんが、あなたが期待している動作がはっきりしません。 – samgak
'アレイが大きすぎて一度にコピーできません'を定義してください。どうして? [JNI仕様](https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#Set_PrimitiveType_ArrayRegion_routines)には制限がありません。 – EJP