加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[Android] OpenGL eglSwapBuffers failed: EGL_BAD_ALLOC,or EGL_BAD_SURFACE

(2012-02-07 12:38:34)
标签:

杂谈

分类: android
在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                     // This seems to happen if the native window is removed while rendering.
1059                     Log.e("EglHelper", "eglSwapBuffers returned EGL_BAD_ALLOC. tid=" + Thread.currentThread().getId());
1060                     break;
1062                 case EGL10.EGL_BAD_SURFACE:
1065                     // This seems to happen if the native window is removed while rendering.
1066                     Log.e("EglHelper", "eglSwapBuffers returned EGL_BAD_SURFACE. tid=" + Thread.currentThread().getId());
1067                     break;
1068                 default:
1069                     throwEglException("eglSwapBuffers", error);
1070                 
1071             
1072             return true;
1073         
 
 

0

阅读 收藏 喜欢 打印举报/Report
后一篇:然然学动物叫
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有