2

我有一个基于 SDK/NDK 的应用程序,它创建本机缓冲区,然后将数据读/写到那里以通过 JNI 桥进行通信。在 4.4 (DALVIK) 中,它运行正常 - 或者至少它没有抛出异常。一旦 ART 成为强制性的,即 Lollipop - 它现在在应用程序关闭/退出时失败。在此处创建直接缓冲区:

JNIEXPORT void JNICALL Java_com_class_nativeOnDirect(JNIEnv* jenv,   jobject obj, jobject   m, jobject mv){
  GLubyte* _dData;
_dData = (GLubyte*)jenv->GetDirectBufferAddress(m);
}

清除直接数据:

 JNIEXPORT void JNICALL Java_com_class_nativeOnFreeNativeBuffer(JNIEnv* jenv, jobject obj, jobject m){
 jenv->DeleteGlobalRef(m);
}   

经过对此的一些研究 - 我仍然不清楚为什么会发生这种情况。顺便说一句 - 如果“DeleteGlobalref(jobjct) 没有发生 - 不会引发异常。害怕这里发生内存泄漏。提前致谢

4

1 回答 1

3

你不应该调用DeleteGlobalRef本地 ref - 只调用jobject你从NewGlobalRef. 所以在这种情况下,只要你不打电话NewGlobalRef,你也不需要打电话DeleteGlobalRef

仅当您在本机端存储对对象的引用时才需要使用NewGlobalRef,以便在 JNI 函数调用返回后使用。

ART 在正确使用 JNI API 方面比 dalvik 严格一点,所以代码一直不正确,只是没有触发任何错误。有关如何启用 CheckJNI 进行更严格检查的提示,请参阅http://android-developers.blogspot.fi/2011/07/debugging-android-jni-with-checkjni.html ,以便能够更早地发现此类问题。

于 2014-11-24T20:13:14.503 回答