将2D bytearray传递给C Jni 我想通过JNI将一个2D字节数组从java传递到C++,一切都很好,但是我不能得到第三数组的值。

将2D bytearray传递给C Jni 我想通过JNI将一个2D字节数组从java传递到C++,一切都很好,但是我不能得到第三数组的值。,java,java-native-interface,Java,Java Native Interface,爪哇: C++: 我无法获取第三个数组的值。我是否正确使用GetPrimitiveArrayCritical?您违反了下列规则中给出的两个或三个规则: 如果成功,GetXXX后面必须跟一个ReleaseXXX GetXXXCritical可以嵌套,也就是说,应该以相反的顺序发布 而且,当处于关键区域时,最好不要调用I/O或其他长时间运行的函数 注:isCopy仅供参考。您最好传递NULL,而不是&isCopy,因为您无论如何都不会使用它。 byte[][] b = new byte[3]

爪哇:

C++:


我无法获取第三个数组的值。我是否正确使用GetPrimitiveArrayCritical?

您违反了下列规则中给出的两个或三个规则:

  • 如果成功,GetXXX后面必须跟一个ReleaseXXX
  • GetXXXCritical可以嵌套,也就是说,应该以相反的顺序发布
  • 而且,当处于关键区域时,最好不要调用I/O或其他长时间运行的函数

  • 注:
    isCopy
    仅供参考。您最好传递
    NULL
    ,而不是
    &isCopy
    ,因为您无论如何都不会使用它。
        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);
    
    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