2016-11-01 2 views
2

Я хотел передать 2D-массив байтов из Java в C++ с помощью JNI, все кажется прекрасным, но я не могу получить значение третьего массива.Передача 2D bytearray на C Jni

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 

Я не могу достичь значения третьего массива. Я правильно использую GetPrimitiveArrayCritical?

+0

Примечание: 'isCopy' является только FYI. Вы также можете передать 'NULL' вместо' & isCopy', так как вы все равно не используете его. –

ответ

0

Вы нарушаете два или три правила, приведенные в documentation:

  1. GetXXX, в случае успеха, должна сопровождаться ReleaseXXX.
  2. GetXXXCritical может быть вложенным, то есть вы должны выпустить в обратном порядке.
  3. И, вероятно, лучше не называть I/O или другие долговременные функции в критической области.