我正在使用 JNI 中的字节数组。我无法获得 jbyteArray 的 长度 。我正在 Windows 7 中的 eclipse 中编写代码。
Java代码:
private native int Enroll( byte[] pSeed );
JNI代码:
在JNI中,我有一个包含两个成员unsigned long length
和unsigned 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;
?
答案 0 :(得分:27)
您可以使用GetArrayLength(JNIEnv* env, jbyteArray array)
阅读 here。
不确定您要执行的操作,我假设您需要jpSeed
中bd.data[1]
的内容。
无论如何,访问字节数组的内容应该使用GetByteArrayElements(...).
答案 1 :(得分:3)
对问题1的回答。 由于jpSeed
为jbyteArray
,这意味着您可以通过调用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];
}
不要忘记释放。