【问题标题】:How can I avoid Fatal signal 11 crash in Vuforia for Android?如何避免 Vuforia for Android 中的致命信号 11 崩溃?
【发布时间】:2013-11-22 03:27:43
【问题描述】:

我正在开发带有大约 30 个小标记的 FrameMarkers 示例应用程序,用于渲染简单的 2D 平面。我的应用程序有几个 GUI 按钮,单击这些按钮会更改显示的纹理(在黄色或灰色之间)。这部分有效,但有时应用程序会崩溃并出现以下错误:

11-22 12:52:36.361: A/libc(7197): Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1), thread 7278 (Thread-527)

这是我如何将灰色纹理切换为黄色的示例:

// First, set the textures in the texture array
for (int i=0;i<30;i+2) {
    mTextures.set(i, textureYellow);
}

// Reinitialize the renderer
deinitApplicationNative();
initApplicationNative(mScreenWidth, mScreenHeight);
mGlView.queueEvent(new Runnable() {
    public void run() {                             
        mRenderer.initRendering();
    }
});

这是在运行时切换纹理的建议方法(参见here),我让它在FrameMarkers.java 内部运行(它是通过处理程序从另一个活动中单击按钮触发的)。我应该重申,应用程序不会在每次纹理更改时崩溃。在每次运行时,它都会在不同的点崩溃,但我已将问题隔离在更改纹理和重新初始化渲染器的过程中(因为它似乎在按下按钮后发生)。

  • 是什么原因导致这种情况如此频繁地崩溃?
  • 是否有更安全的方法在 Vuforia 应用程序运行期间更改纹理?

在 Android 4.3 上运行。

【问题讨论】:

  • 我已经与 Vuforia 的一些人澄清说,这确实是在运行时更改纹理的正确方法。您需要在主线程(deinitApplicationNative()initApplicationNative())上调用前两个本机方法,在 GL 线程上调用mRender.initRendering()。我删除了 Handler 并直接从主线程调用方法,它崩溃的频率要低得多。
  • 另一个有趣的发现是运行 Android 2.3.3 的旧设备。不会受到这次崩溃的影响。会不会是 Android 4.3 以不同的方式处理内存/垃圾收集并导致 SIGSEGV?

标签: android augmented-reality vuforia


【解决方案1】:

我似乎已经解决了这个错误。事实上,我原始帖子中的代码是在运行时切换纹理的正确方法(这已由 Vuforia 论坛上的管理员确认)。

问题是线程问题。我已从 Dominoes 示例应用程序中检索到 GUIManager 类的代码,以向屏幕添加按钮和其他元素。该类使用Handler 接收消息,然后执行适当的与 GUI 相关的任务。

问题是您必须确保在主线程上调用initApplicationNative(),而在GLThread 上调用mRenderer.initRendering()。不仅如此,如果纹理数组在initApplicationNative() 调用和mRenderer.initRendering() 调用之间的任何时候发生变化,它可能会导致本机代码失败(有一些assert() 调用)。

这里有更多关于 Vuforia 线程的信息:https://developer.vuforia.com/forum/faq/android-which-methods-are-called-ui-vs-opengl-thread

我认为存在时间问题,以及有时在错误的线程上调用函数。为了使我的程序正常工作,我从FrameMarkers.javaGUIManager.java 中删除了处理程序,并从主线程中调用了我所有的纹理更新代码。

这可确保始终从主线程调用 deinitApplicationNative()initApplicationNative(),而 mGlView.queueEvent() 可确保 GL 代码在该线程上运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 2017-08-13
    相关资源
    最近更新 更多