Android: createWindowSurface 失败 EGL_NOT_INITIALIZED
Android: createWindowSurface failed EGL_NOT_INITIALIZED
我最近遇到了问题,我的应用程序在离开某个 Activity 后立即崩溃。该应用程序使用 gstreamer 1.4+ 进行流式传输,它在管道末端使用 glimagesink
在 SurfaceView
上显示流。我发现有时(在我的情况下大部分时间),当流在 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
中的 ].
我最近遇到了问题,我的应用程序在离开某个 Activity 后立即崩溃。该应用程序使用 gstreamer 1.4+ 进行流式传输,它在管道末端使用 glimagesink
在 SurfaceView
上显示流。我发现有时(在我的情况下大部分时间),当流在 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
中的 ].