JNI:如何获得jbyteArray大小

时间:2011-06-07 08:28:48

标签: android arrays eclipse size java-native-interface

背景

我正在使用 JNI 中的字节数组。我无法获得 jbyteArray 长度 。我正在 Windows 7 中的 eclipse 中编写代码。

Java代码:

private native int Enroll( byte[] pSeed );

JNI代码:

在JNI中,我有一个包含两个成员unsigned long lengthunsigned char data[1]的结构

typedef struct blobData_s {
    unsigned long     length;
    unsigned char     data[1];
} blobData_t;

现在我的JNI函数得到参数jbyteArray jpSeed我希望得到jpSeed的长度并将其设置为struct的长度成员。

JNIEXPORT jint JNICALL Java_com_Test_Enroll( JNIEnv* env, jobject thiz, jbyteArray jpSeed ){
     blobData_t* bd = malloc( sizeof(blobData_t) );
     bd->length = **Question 1**
     bd->data[1] = jbyteArray;
}

问题1:如何在JNI中获得jpSeed的长度?

问题2:此代码是否正常bd.data[1] = jbyteArray;

2 个答案:

答案 0 :(得分:27)

  1. 您可以使用GetArrayLength(JNIEnv* env, jbyteArray array) 阅读 here

  2. 不确定您要执行的操作,我假设您需要jpSeedbd.data[1]的内容。 无论如何,访问字节数组的内容应该使用GetByteArrayElements(...).

答案 1 :(得分:3)

解决方案

对问题1的回答。 由于jpSeedjbyteArray,这意味着您可以通过调用GetByteArrayElements( ... )函数来获取它的长度在JNI中声明(您可以阅读文档here),这里正确的代码将是:

JNIEXPORT jint JNICALL Java_com_Test_Enroll( JNIEnv* env, jobject thiz, jbyteArray jpSeed ){
     blobData_t* bd = malloc( sizeof(blobData_t) );
     bd->length = (*env)->GetArrayLength( env, jpSeed );
     .......
}

对问题2的回答。 bd->data[1] = jbyteArray;代码不正确,因为无法编译此部分的正确解决方案是:

JNIEXPORT jint JNICALL Java_com_Test_Enroll( JNIEnv* env, jobject thiz, jbyteArray jpSeed ){
     blobData_t* bd = malloc( sizeof(blobData_t) );
     .......
     jbyte* bytes = (*env)->GetByteArrayElements( env, jpSeed, 0 );
     bd->data[1] = bytes[1];
}

不要忘记释放。