我从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。 我究竟做错了什么?任何帮助将不胜感激。
答案 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;