eglCreateWindowSurface 失败,出现 java.lang.IllegalArgumentException。

7
尝试在启动某些使用GLSurfaceView的活动时快速按下返回按钮,eglCreateWindowSurface会失败并出现java.lang.IllegalArgumentException异常。我遇到了以下错误:
10-08 18:05:36.490: E/GLSurfaceView(3440): eglCreateWindowSurface
10-08 18:05:36.490: E/GLSurfaceView(3440): java.lang.IllegalArgumentException: Make sure the SurfaceView or associated SurfaceHolder has a valid Surface
10-08 18:05:36.490: E/GLSurfaceView(3440): at com.google.android.gles_jni.EGLImpl._eglCreateWindowSurface(Native Method)
10-08 18:05:36.490: E/GLSurfaceView(3440): at com.google.android.gles_jni.EGLImpl.eglCreateWindowSurface(EGLImpl.java:90)
10-08 18:05:36.490: E/GLSurfaceView(3440): at android.opengl.GLSurfaceView$DefaultWindowSurfaceFactory.createWindowSurface(GLSurfaceView.java:798)
10-08 18:05:36.490: E/GLSurfaceView(3440): at android.opengl.GLSurfaceView$EglHelper.createSurface(GLSurfaceView.java:1065)
10-08 18:05:36.490: E/GLSurfaceView(3440): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1433)
10-08 18:05:36.490: E/GLSurfaceView(3440): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1216)

SurfaceHolder.Callback.surfaceCreated之前或SurfaceHolder.Callback.surfaceDestroyed之后,这些活动没有调用GL操作。

有人遇到过这个问题吗?解决方案是什么?

感谢您的任何帮助。

2个回答

12

快速在多个Activity之间切换会破坏窗口表面。

我修改了GLSurfaceView.guardedRun()以避免GLSurfaceView的竞争条件。

源自:

                if (createEglSurface) {
                    if (LOG_SURFACE) {
                        Log.w("GLThread", "egl createSurface");
                    }
                    gl = (GL10) mEglHelper.createSurface(getHolder());
                    if (gl == null) {
                        // Couldn't create a surface. Quit quietly.
                        break;
                    }
                    sGLThreadManager.checkGLDriver(gl);
                    createEglSurface = false;
                }

至:

                if (createEglSurface) {
                    if (LOG_SURFACE) {
                        Log.w("GLThread", "egl createSurface");
                    }
                    gl = (GL10) mEglHelper.createSurface(getHolder());
                    if (gl == null) {
                        // If we escape, GLThread ends up. Don't escape.
                        continue;
                    }
                    sGLThreadManager.checkGLDriver(gl);
                    createEglSurface = false;
                }

我觉得这个问题已经在JellyBean中得到修复了。


干得好,谢谢!由于没有任何简单的方法来修补一行代码,我最终从Jelly Bean回溯了整个类。 - usethe4ce
1
你怎么修补那一行代码?我遇到了同样的问题。你能给我一些提示吗?非常感谢。 - AmyWuGo
@AmyWuGo - 将此文件(https://gist.github.com/dalinaum/3890965)添加到您的项目中。 - Dalinaum
1
@Dalinaum 非常感谢。我尝试了你的源代码,错误的频率降低了,但并没有完全消失。我认为我的应用程序中还有其他错误。谢谢。 - AmyWuGo
@AmyWuGo,SurfaceView在JB之前存在一些bug。请检查最新的SurfaceView,它会对你有所帮助。 - Dalinaum

1

我曾经遇到同样的问题,通过设置surfaceDestroyed回调并调用super.surfaceDestroyed解决了它。

glSurfaceView = new GLSurfaceView(context) {
    public void surfaceDestroyed(SurfaceHolder holder) {
        super.surfaceDestroyed(holder);
    }
};

我的问题不同。请看我的回答。无论如何,谢谢你,@codeNinja。 - Dalinaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接