Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于在JNI中分配的数组_Java_Android_Android Ndk_Java Native Interface - Fatal编程技术网

Java 关于在JNI中分配的数组

Java 关于在JNI中分配的数组,java,android,android-ndk,java-native-interface,Java,Android,Android Ndk,Java Native Interface,我在AndroidJNI中编写了一个分配Java数组的函数。但是,如果从Java连续调用此函数,将出现错误[*致命信号11(SIGSEGV)] C++ 爪哇 我不应该用这种方式吗?或者有一些措施吗?如果您想在JNI调用之间保留jobject(如jbyteArray),则需要将其设置为GlobalRef: jbyteArray temp_buffer = env->NewByteArray(buflen); buffer = (jbyteArray)env->NewGlobalRef(

我在AndroidJNI中编写了一个分配Java数组的函数。但是,如果从Java连续调用此函数,将出现错误[*致命信号11(SIGSEGV)]

C++

爪哇


我不应该用这种方式吗?或者有一些措施吗?

如果您想在JNI调用之间保留jobject(如jbyteArray),则需要将其设置为GlobalRef:

jbyteArray temp_buffer = env->NewByteArray(buflen);
buffer = (jbyteArray)env->NewGlobalRef(temp_buffer);
然后才记得删除对象以释放内存:

env->DeleteGlobalRef(buffer);

你所说的“连续呼叫”是什么意思?你是从多个线程调用它吗?为什么?为什么要用JNI写这个?在Java中效率更高,Java中的一些类已经为您提供了这样的功能,例如ByteArrayOutputStream。这非常有用。谢谢你。另外,如果您启用CheckJNI(在该页后面描述),Dalvik在看到这样的情况时会大声抱怨。@MārtiņšMožeiko,在您的代码中,是
temp_buffer
auto released,还是应该调用
env->DeleteLocalRef(temp_buffer)
localref?当您从JNI方法返回时,本地引用会自动释放。因此,这是不必要的。但如果需要,可以显式管理本地引用的生存期。使用DeleteLocalRef或使用PopLocalFrame批量执行。
jbyteArray temp_buffer = env->NewByteArray(buflen);
buffer = (jbyteArray)env->NewGlobalRef(temp_buffer);
env->DeleteGlobalRef(buffer);