我有一个C函数,如下所示:
int getInfo(int index, int type, void *pValue, int valueLen);
pValue是用于保存信息值的缓冲区的地址。 但是,缓冲区必须事先由调用方分配。
因为我相当确定我正在处理小数据,所以我在Java托管代码中执行以下操作...
public native int callGetInfo(int index, int type, byte[] value);
...然后传递一个固定大小的字节数组,如下所示:
byte[] buf = new byte[1024];
callGetInfo(idx, t, buf);
原因是因为我读到小数据,在性能方面,使用字节数组比ByteBuffer更好。
我自动生成的JNI标头如下:
JNIEXPORT jint JNICALL Java_com_testing_jni_Tester_callGetInfo (JNIEnv *, jobject, jint, jint, jbyteArray);
到目前为止,这是我的桥接函数内部的功能:
JNIEXPORT jint JNICALL Java_com_testing_jni_Tester_callGetInfo (JNIEnv *env, jobject obj, jint index, jint type, jbyteArray array)
{
jboolean isCopy;
jbyte* bufferPtr = (*env)->GetByteArrayElements(env, array, &isCopy);
// here I need to call the getInfo(index, type, pValue, valueLen) function, and then convert the pValue into a jbyteArray and return it using array
if(isCopy) {
(*env)->ReleaseByteArrayElements(env, array, bufferPtr, 0);
}
return 0;
}
在我的桥接函数中,我想将我从getInfo函数获得的pValue的值(无论是pValue类型)转换为jbyteArray以便可以将其返回给Java调用者。 我该如何实现?