Android: createWindowSurface 失败 EGL_NOT_INITIALIZED

Android: createWindowSurface failed EGL_NOT_INITIALIZED

我最近遇到了问题,我的应用程序在离开某个 Activity 后立即崩溃。该应用程序使用 gstreamer 1.4+ 进行流式传输,它在管道末端使用 glimagesinkSurfaceView 上显示流。我发现有时(在我的情况下大部分时间),当流在 Activity 被销毁之前没有传送关键帧时,应用程序会崩溃并出现以下错误:

 validate_display:211 error 3001 (EGL_NOT_INITIALIZED)
 eglMakeCurrent:450 error 3008 (EGL_BAD_DISPLAY)
 validate_display:211 error 3001 (EGL_NOT_INITIALIZED)
 eglMakeCurrent:450 error 3008 (EGL_BAD_DISPLAY)
 validate_display:211 error 3001 (EGL_NOT_INITIALIZED)
 Shutting down VM
 thread exiting with uncaught exception (group=0x41b992a0)
 FATAL EXCEPTION: main
 java.lang.RuntimeException: createWindowSurface failed EGL_NOT_INITIALIZED
    at android.view.HardwareRenderer$GlRenderer.createSurface(HardwareRenderer.java:1018)
    at android.view.HardwareRenderer$GlRenderer.createEglSurface(HardwareRenderer.java:911)
    at android.view.HardwareRenderer$GlRenderer.initialize(HardwareRenderer.java:748)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1652)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1131)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4611)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
    at android.view.Choreographer.doCallbacks(Choreographer.java:555)
    at android.view.Choreographer.doFrame(Choreographer.java:525)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4898)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
    at dalvik.system.NativeStart.main(Native Method)

这次崩溃让我抓狂,我找不到任何关于导致它发生的线索。但最近我发现了这个错误报告,这似乎是问题的根源:android issue 37413. Together with the helpful notes on EGL found over here我找到了修复程序。

问题的根源在于,在 Android 的最新版本中,调用 eglTerminate 而不首先调用 eglInitialize 会导致 EGL_NOT_INITIALIZED,进而导致未捕获的 RuntimeException。正如第一个 link 中所述,这是 Android 中的错误,因为它不符合 EGL 规范。

解决方案是确保 EGL 已初始化(我在将 SurfaceView 传递给 gstreamer 时调用我的):

EGL10 egl = (EGL10) EGLContext.getEGL();
EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
boolean ret = egl.eglInitialize(display, null);

if (!ret)
    Log.e(TAG, "EGL init error: " + egl.eglGetError());
else
    // do your thing

请注意,有些类名是矛盾的 - 您需要使用 javax.microedition.khronos.egl 中的 类, 而不是 android.opengl 中的 ].