我最近在离开某个活动时遇到了我的应用崩溃的问题。该应用程序使用gstreamer 1.4+进行流式传输,使用管道末端的glimagesink
在SurfaceView
上显示流。我发现有时(在我的情况下大部分时间),当流在活动被销毁之前没有提供关键帧时,应用程序会因以下错误而崩溃:
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)
答案 0 :(得分:0)
这次事故让我疯狂,我没有发现任何导致它的原因。但最近我发现了这个错误报告,这似乎是问题的根源:android issue 37413。结合有关EGL的有用说明over here,我找到了解决方法。
问题的根源在于,在最近版本的Android调用eglTerminate而不调用eglInitialize时,首先导致EGL_NOT_INITIALIZED,这反过来会导致未捕获的RuntimeException。如第一个链接所述,这是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
的类。