当我尝试在运行Android 4.4的手机上启动我的应用程序时,我收到一个错误我不明白(如果这有帮助的话,这是一个Moto G):
java.lang.IllegalArgumentException: remaining() < needed
Exception thrown in Thread[GLThread 85832,5,main] java.lang.IllegalArgumentException: remaining < needed
at android.opengl.GLES20.glGetInteger v(Native Method)
at com.jme3.renderer.android.OGLESShaderRenderer.intialize(OGLESShaderRenderer.java:311)
at com.jme3.system.android.OGLESContext.initInThread(OGLESContext.java:215)
at com.jme3.system.android.OGLESContext.onSurfaceCreated(OGLESContext.java:187)
at android.opengl.GLSurfaceView$GLTread.guardedRun(GLSurfaceView.java:1501)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
当我在运行Android 4.0的Xperia U上运行完全相同的代码时,运行正常。这里发生了什么,我可以采取哪些步骤来确保我的代码在各种设备上运行?
答案 0 :(得分:1)
glGetIntegerv()
Java绑定的一个变体采用IntBuffer
参数来保存多个返回值。如果您的请求需要的空间大于缓冲区所需的空间,则会出现此错误。
旧版本的jMonkeyEngine使用固定大小的缓冲区请求GL_COMPRESSED_TEXTURE_FORMATS
。在支持太多格式的设备上调用失败。 (您应该查询GL_NUM_COMPRESSED_TEXTURE_FORMATS
,并使用该值来调整缓冲区的大小。)在旧版本的Android上,这实际上导致了堆损坏,因为Java语言绑定使得比较错误并允许数据写入在IntBuffer
(fixed)结束后。
您可以看到jMonkeyEngine applied here的修复程序。根据例外中的行号判断,您使用的是修复前的jMonkeyEngine版本。