我在 Android JNI 中编写了一个分配 Java 数组的函数。但是,如果从 Java 连续调用此函数,则会发生错误[*Fatal signal 11 (SIGSEGV)]。
C++
static jbyteArray buffer = NULL;
static int cbuflen = 0;
jbyteArray Java_com_sample_buffer_Buffer_updateBuffer(JNIEnv* env, jobject thiz, jlong handle, jint buflen)
{
if(buflen > cbuflen){
if(buffer != NULL) env->DeleteLocalRef(buffer);
buffer = env->NewByteArray(buflen);
cbuflen = buflen;
}
return buffer;
}
Java
byte[] buf = conv.updateBuffer(buflen);
我不应该使用这种方式吗?或者有什么措施?
最佳答案
如果你想在 JNI 调用之间保留 jobject(如 jbyteArray),你需要将其设为 GlobalRef:
jbyteArray temp_buffer = env->NewByteArray(buflen);
buffer = (jbyteArray)env->NewGlobalRef(temp_buffer);
然后才记得删除对象以释放内存:
env->DeleteGlobalRef(buffer);
关于java - 关于在 JNI 中分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13197965/