2016-10-31 3 views
2

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の値が間違っています。

この動作は非常に奇妙です...私は何か間違っていますか?

ありがとうございました!

+1

'from'にどの値を使用していますか、nextmapping_mapのインデックスはどのように設定しますか、どのバイトインデックスから読み込もうとしていますか?オフセットは、ネイティブバッファではなく、バイト配列内にのみあります。それは誤解ですか?最後のパラメータとして 'nextmapping_map + from'を渡す必要があるかもしれませんが、あなたが期待している動作がはっきりしません。 – samgak

+0

'アレイが大きすぎて一度にコピーできません'を定義してください。どうして? [JNI仕様](https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#Set_PrimitiveType_ArrayRegion_routines)には制限がありません。 – EJP

答えて

0

SetByteArrayRegionに渡されるfromパラメータは、java配列のインデックスです。これはC配列のインデックスではありません。

全42に初期化
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } 

およびJava byteArray:例えば

はCアレイaを持たせ

{ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, ... 

次いでSetByteArrayRegion(env, byteArray, 3, 4, a)コピーインデックスで0byteArrayに位置指標を起動アレイaから4つの要素3byteArrayでの結果は次のようになります。

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

それがJava配列にC配列の領域をコピーして、インデックスを維持するために必要な場合には、C列の先頭にオフセットを追加する必要がある:

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

あなたは正しいです!助けてくれてありがとう! – user25005

関連する問題