将2D bytearray传递给C Jni

时间:2016-11-01 23:01:33

标签: java java-native-interface

我想使用JNI将一个2D字节数组从Java传递到C ++,一切似乎都很好,但我无法获得第三个数组的值。

爪哇:

    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吗?

1 个答案:

答案 0 :(得分:0)

您违反了documentation中提供的两个或三个规则:

  1. GetXXX,如果成功,必须跟随ReleaseXXX。
  2. GetXXXCritical可以嵌套,也就是说,你应该以相反的顺序发布。
  3. 而且,在关键区域最好不要调用I / O或其他长时间运行的功能。