在JNI / OpenGL ES加载代码期间,非常规和狡猾的Android崩溃

时间:2011-08-04 06:20:55

标签: android opengl-es crash java-native-interface android-ndk

4 个答案:

答案 0 :(得分:1)

我无法回复:(,我刚才有类似的问题,并注意到某个地方的java doc说当有线程时(如果你正在做OpenGL然后有线程)。你需要小心第一个参数(env)和第二个参数(jobject)。你不能在不同的线程上共享,因为它们是特定于线程的。

对于我的情况,有事件线程和渲染线程。我有一个全球环境& jself变量是在调用jni时传入的2个参数。我更改了代码以确保只有渲染线程触及env / jself变量。在事件线程中,我传入原始数据,只需记下需要做什么,因此不需要env / jself变量。当然我使用互斥锁来锁定我的事件结构。

看起来你在这里设置env可能是globaly gameasset.env = env;

如果gameasset是全局的或者被不同的线程使用,只需通过互斥锁/锁定共享env或jobject类变量就行不通(它们是特定于线程的)。

TL:DR;当从java调用jni方法时,我只访问env变量,并在渲染线程上访问jobject第二个变量,而没有其他地方,这到目前为止已经解决了我的问题。

答案 1 :(得分:1)

起初看起来很愚蠢,但是你的问题让我想起了我们在某个Android应用程序中遇到的问题。我们正在尽最大努力通过使用“静态”对象来实现最佳效果,我们确信这些对象只能存在一次,我们只想创建一次。这似乎与Android中的我们的活动生命周期不一致(经过大量调试和头痛),因此我们切换到使用实例并允许操作系统处理活动的清理和优化。这解决了我们的问题,我们的应用程序足够稳定。

答案 2 :(得分:1)

从我之前的评论中发帖。 “可能会发生JNI异常,因为在异常之后你没有返回,它可能会导致崩溃。我不知道Android的日志记录是如何工作的,但是在C中一个简单的printf,不需要立即输出日志。所以在崩溃发生的情况下,可能是发生了异常,但系统在输出日志之前崩溃了“ 在网上停了几天。希望崩溃不会回来......我讨厌一些问题,如果没有明确的解释就会神奇地消失。他们通常会马上回来咬你;-)无论如何希望你不要被咬伤

答案 3 :(得分:0)

冒着指出非常明显的风险......你确定你没有溢出str吗?

char str[64];
sprintf(str, "%s/GameAssets", ROOTSTR);