[Android] OpenGL eglSwapBuffers failed: EGL_BAD_ALLOC,or EGL_BAD_SURFACE
(2012-02-07 12:38:34)
在android系统,运用OpenGL时,出现以下exception:
E/AndroidRuntime( 945): FATAL EXCEPTION: GLThread
10
E/AndroidRuntime( 945): java.lang.RuntimeException: eglSwapBuffers
failed: EGL_BAD_ALLOC
E/AndroidRuntime( 945): at
android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1077)
E/AndroidRuntime( 945): at
android.opengl.GLSurfaceView$EglHelper.swap(GLSurfaceView.java:1035)
E/AndroidRuntime( 945): at
android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1333)
E/AndroidRuntime( 945): at
android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1116)
|
E AndroidRuntime: FATAL EXCEPTION: GLThread
14
E AndroidRuntime: java.lang.RuntimeException:
eglSwapBuffers failed: EGL_BAD_SURFACE
E AndroidRuntime: at
android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1105)
E AndroidRuntime: at
android.opengl.GLSurfaceView$EglHelper.swap(GLSurfaceView.java:1063)
E AndroidRuntime: at
android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1406)
E AndroidRuntime: at
android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1144)
在网上看到一种方法:EglHelper.swap是在GLSurfaceView.java文件里的GLThread.guardedRun()调用的,而swap()所在的try没有catch,在try{}和finally{}之间加上catch
(RuntimeException e){}就可以了。
这种方法虽然不会再出现force
close,但又引出更严重的问题,比如:Idle只显示背景,没有其他快捷按钮,不能打开各种应用。重启后才正常。
|
一个解决方法如下:
EglHelper.swap是在GLSurfaceView.java文件里的swap()中,忽略掉这个异常。经测试可以工作。
1037
public boolean swap() {
1038
if (! mEgl.eglSwapBuffers(mEglDisplay, mEglSurface)) {
1039
1040
1046
int error = mEgl.eglGetError();
1047
switch(error) {
1048
case EGL11.EGL_CONTEXT_LOST:
1049
return false;
1050
case EGL10.EGL_BAD_NATIVE_WINDOW:
1051
// The native window is bad, probably because the
1052
// window manager has closed it. Ignore this error,
1053
// on the expectation that the application will be closed
soon.
1054
Log.e("EglHelper", "eglSwapBuffers returned EGL_BAD_NATIVE_WINDOW.
tid=" + Thread.currentThread().getId());
1055
break;
1057
case EGL10.EGL_BAD_ALLOC:
1058 | |