从JNI获取java中的空字节数组

时间:2011-04-27 12:54:18

标签: java java-native-interface

我从java调用本机函数返回一个byte []。
以下是JNI代码的片段

jbyteArray result;  
jbyte *resultType;  
result = (*env)->NewByteArray(env, 1);  
*resultType =7;
(*env)->SetByteArrayRegion(env, result, 0, 1, resultType);    
return result;

这应该创建一个长度为1的字节数组,并将值7存储在其中。我的实际代码应该创建一个动态长度的数组,但是我遇到了与本例中相同的问题。

现在遇到我的问题 - 在java中,从JNI返回的数组为null。 我究竟做错了什么?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:7)

SetByteArrayRegion()的原型是:

void SetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);

最后一个参数是一个内存缓冲区,SetByteArrayRegion()将复制到Java数组中。

您永远不会初始化该缓冲区。你在做:

jbyte* resultType;
*resultType = 7; 

我很惊讶你没有获得核心转储,因为你正在将7写入内存中的某个随机位置。相反,这样做:

jbyte theValue;
theValue = 7;
(*env)->SetByteArrayRegion(env, result, 0, 1, &theValue);

更一般地说,

// Have the buffer on the stack, will go away
// automatically when the enclosing scope ends
jbyte resultBuffer[THE_SIZE];
fillTheBuffer(resultBuffer);
(*env)->SetByteArrayRegion(env, result, 0, THE_SIZE, resultBuffer);

// Have the buffer on the stack, need to
// make sure to deallocate it when you're
// done with it.
jbyte* resultBuffer = new jbyte[THE_SIZE];
fillTheBuffer(resultBuffer);
(*env)->SetByteArrayRegion(env, result, 0, THE_SIZE, resultBuffer);
delete [] resultBuffer;