尝试在模拟器中运行示例AndEngine gles2代码会抛出“java.lang.IllegalArgumentException:找不到EGLConfig!”,我该如何解决这个问题?

我试图在模拟器中运行一个小样本游戏代码,但它崩溃了。 我的LogCat在这里给出。 你能帮我解决这个问题吗?

02-23 15:18:50.543: D/AndEngine(636): MainActivity.onCreate @(Thread: 'main') 02-23 15:18:50.633: D/dalvikvm(636): Trying to load lib /data/data/com.example.gamegles2demo/lib/libandengine.so 0x40513d70 02-23 15:18:50.633: D/dalvikvm(636): Added shared lib /data/data/com.example.gamegles2demo/lib/libandengine.so 0x40513d70 02-23 15:18:50.633: D/dalvikvm(636): No JNI_OnLoad found in /data/data/com.example.gamegles2demo/lib/libandengine.so 0x40513d70, skipping init 02-23 15:18:50.903: D/AndEngine(636): MainActivity.onResume @(Thread: 'main') 02-23 15:18:50.953: D/AndEngine(636): MainActivity.onPause @(Thread: 'main') 02-23 15:18:50.953: D/AndEngine(636): MainActivity.onDestroy @(Thread: 'main') 02-23 15:18:50.983: D/AndEngine(636): UpdateThread interrupted. Don't worry - this EngineDestroyedException is most likely expected! 02-23 15:18:50.983: D/AndEngine(636): org.andengine.engine.Engine$EngineDestroyedException 02-23 15:18:50.983: D/AndEngine(636): at org.andengine.engine.Engine.throwOnDestroyed(Engine.java:574) 02-23 15:18:50.983: D/AndEngine(636): at org.andengine.engine.Engine.onTickUpdate(Engine.java:560) 02-23 15:18:50.983: D/AndEngine(636): at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820) 02-23 15:18:50.983: D/AndEngine(636): MainActivity.onDestroyResources @(Thread: 'main') 02-23 15:18:50.994: D/AndEngine(636): MainActivity.onGameDestroyed @(Thread: 'main') 02-23 15:18:51.073: D/AndEngine(636): MainActivity.onCreate @(Thread: 'main') 02-23 15:18:51.093: D/AndEngine(636): MainActivity.onResume @(Thread: 'main') 02-23 15:18:51.643: D/libEGL(636): egl.cfg not found, using default config 02-23 15:18:51.653: D/libEGL(636): loaded /system/lib/egl/libGLES_android.so 02-23 15:18:51.803: W/dalvikvm(636): threadid=10: thread exiting with uncaught exception (group=0x40015560) 02-23 15:18:51.803: E/AndroidRuntime(636): FATAL EXCEPTION: GLThread 13 02-23 15:18:51.803: E/AndroidRuntime(636): java.lang.IllegalArgumentException: No EGLConfig found! 02-23 15:18:51.803: E/AndroidRuntime(636): at org.andengine.opengl.view.ConfigChooser.chooseConfig(ConfigChooser.java:183) 02-23 15:18:51.803: E/AndroidRuntime(636): at org.andengine.opengl.view.ConfigChooser.chooseConfig(ConfigChooser.java:157) 02-23 15:18:51.803: E/AndroidRuntime(636): at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:919) 02-23 15:18:51.803: E/AndroidRuntime(636): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1264) 02-23 15:18:51.803: E/AndroidRuntime(636): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118) 02-23 15:18:52.294: D/AndEngine(636): MainActivity.onPause @(Thread: 'main') 02-23 15:18:54.404: D/AndEngine(636): MainActivity.onDestroy @(Thread: 'main') 02-23 15:18:54.464: D/AndEngine(636): UpdateThread interrupted. Don't worry - this EngineDestroyedException is most likely expected! 02-23 15:18:54.464: D/AndEngine(636): org.andengine.engine.Engine$EngineDestroyedException 02-23 15:18:54.464: D/AndEngine(636): at org.andengine.engine.Engine.throwOnDestroyed(Engine.java:574) 02-23 15:18:54.464: D/AndEngine(636): at org.andengine.engine.Engine.onTickUpdate(Engine.java:560) 02-23 15:18:54.464: D/AndEngine(636): at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820) 02-23 15:18:54.494: D/AndEngine(636): MainActivity.onDestroyResources @(Thread: 'main') 02-23 15:18:54.494: D/AndEngine(636): MainActivity.onGameDestroyed @(Thread: 'main') 

这并不容易。 我对AndEngine的了解不多,但是我开发了一些GLES 2应用程序,可以在AVD内运行和testing它们(在Android世界中,“虚拟设备”或AVD是正确的术语,而不是“模拟器”)。

看着logcat,我可以看到有一个例外:

 02-23 15:18:50.983: D/AndEngine(636): org.andengine.engine.Engine$EngineDestroyedException 

但是,不仅该计划似乎继续运行,而且前面的一行说

UpdateThread中断。 别担心 – 这个EngineDestroyedException是最有可能的预期!

所以问题不在那里。 几行后你会看到真正的错误:

 02-23 15:18:51.803: E/AndroidRuntime(636): java.lang.IllegalArgumentException: No EGLConfig found! 

search谷歌这个错误带领我在这里 。 主要的问题在这个主题中有明确的说明:

就我所知,仿真器只允许GLES 1。

这不是严格的,但是对于AndEngine来说可能是这样的。

GLES 2和AVDs的问题在于,GLES 2的可编程stream水线需要一个GPU,默认情况下,AVD中的graphics加速支持是被禁用的,并且对它的支持至多是实验性的 :

注意:从SDK Tools Revision 17开始,仿真器的graphics加速function是实验性的; 在使用此function时请注意不兼容性和错误。

所以你可以尝试的第一件事就是创建一个可以find最新固件的AVD。 不幸的是,尽管这可能会奏效,但游戏的运行速度可能会非常缓慢。 其原因是Android开发的主要平台是ARM,几乎完全可以肯定,你的开发工作站是基于x86或者x86_64的,这两者都与ARM截然不同。

那么AVD框架所做的就是仿效ARM CPU和一些未知的GPU。 即使是我的Core i7-3770 Ivy Bridge,也无法实时完成这个任务。

但是不要害怕! Android本身就是多平台的。 您可以使用x86映像创建AVD(在SDK管理器中查找它),并在您的计算机的CPU上启用虚拟化,以便AVD在实际CPU上运行,而无需仿真。 启用AVD的 CPU虚拟化的关键是HAXM (在Android SDK管理器中查找,但请确保手动安装,SDK管理器只会为您下载,但您必须自行安装)

HAXM最棒的地方在于它也支持GPU虚拟化,这意味着GLES 2将在AVD上全速运行,这极大地简化了开发和testing。

虽然使用HAXM的x86 AVD有两个限制:

  1. HAXM是由英特尔开发的一项技术。 这很可能不适用于AMD CPU,但是我没有对自己进行testing。

  2. 即使Android操作系统本身是多平台的,Java本来就是多平台的,但是使用NDK构建的代码是针对单一平台的。 一般而言,这意味着如果您的代码是Java(或Mono),那么在您的加速x86 AVD中制作和运行它就没有问题。

    但是,如果您使用NDK,则还必须为x86构建本机代码。 大多数图书馆开发者并不是懒惰的,因此他们的代码不能在x86 AVD这样的x86设备上运行,而且也不能在像戴尔,摩托罗拉和联想这样的越来越多的x86安卓手机上运行。

坏消息是,AndEngine似乎使用NDK。 我是说因为你提供的logcat显示操作系统试图加载一个名为libandengine.so的库。 .so扩展名几乎全部由NDK模块使用。

我偷看了AndEngine的代码,看起来他们所做的本地东西是非常less的,所以它可能会干净地为x86构建。 但除非x86是受支持的平台,否则股票AndEngine将不会在HAXM上运行。