2016-11-01 9 views
2

JNIを使​​用してJavaからC++へ2Dバイト配列を渡したいと思っていましたが、すべてうまく見えますが、3番目の配列の値を取得できません。2D bytearrayをCに渡すJNY

のJava:

byte[][] b = new byte[3][]; 
    byte[] b1= new byte[]{0x1,0x2,0x3,0x4}; 
    byte[] b2= new byte[]{0x5,0x6,0x7,0x8}; 
    byte[] b3= new byte[]{0x9,0x9,0x9,0x9}; 
    b[0]=b1; 
    b[1]=b2; 
    b[2]=b3; 
    sendData(b); 

C++:私が得る

JNIEXPORT jbyteArray JNICALL Java_jni_JniExample_sendData___3_3B 
    (JNIEnv *env, jobject obj, jobjectArray data) 
{ 
     jboolean isCopy; 
     uint8_t** y = new uint8_t*[3]; 
     for(int i=0;i<3;i++) 
     { 
       jbyteArray bytearray = (jbyteArray)env->GetObjectArrayElement(data, i); 
       y[i] = (uint8_t *)env->GetPrimitiveArrayCritical(bytearray, &isCopy); 
       cout << i << " " << y[i] << endl; 
     } 

} 

出力は次のようになります。

0 0x1 0x2 0x3 0x4 

1 0x5 0x6 0x7 0x8 

2 

私は3番目の配列の値に到達することはできません。 GetPrimitiveArrayCriticalを正しく使用していますか?

+0

注:isCopyはFYIのみです。とにかくそれを使用していないので、 '&isCopy'の代わりに' NULL'を渡すこともできます。 –

答えて

0

あなたはdocumentationに与えられた2つのまたは3つのルールを破っている。

  1. のgetXXX、成功した場合、ReleaseXXXが続かなければなりません。
  2. GetXXXCriticalはネストすることができます。つまり、逆の順序で解放する必要があります。
  3. また、クリティカルな地域でI/Oなどの長時間実行される関数を呼び出さないことをお勧めします。