Java 关于在JNI中分配的数组
我在AndroidJNI中编写了一个分配Java数组的函数。但是,如果从Java连续调用此函数,将出现错误[*致命信号11(SIGSEGV)] C++ 爪哇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(
我不应该用这种方式吗?或者有一些措施吗?如果您想在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);