我正在尝试学习适用于Android的OpenGL ES 1.0。我的应用程序运行良好,直到今天早上我将设备升级到Android 5.0.1,Lollipop。我最初尝试调试这个问题很快发现我的应用程序仍然可以在运行KitKat的模拟器上运行,但在我的设备和模拟器上的Lollipop上崩溃。
我的应用程序使用OpenGL绘制了一个简单的立方体,每边都有不同的纹理。我已经将它故障处理到它在glDrawElements()行崩溃的地方。
package com.briansworld.gravitycubestep7;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;
// draw a cube
// store the cube's position within the multicube
// bind the textures here
class Cube
{
private FloatBuffer mVertexBuffer;
private FloatBuffer myTexBuffer;
private ByteBuffer myIndexBuffer;
public int x, y, z; // used to keep track of which cube is which, not cube position
// constructor
public Cube(int x, int y, int z) // need to add texture ID's
{
this.x = x;
this.y = y;
this.z = z;
float vertices[] =
{
-1.0f, -1.0f, 1.0f, // front
1.0f, -1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, -1.0f, 1.0f, // right
1.0f, -1.0f, -1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, -1.0f,
1.0f, -1.0f, -1.0f, // rear
-1.0f, -1.0f, -1.0f,
1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, -1.0f,
-1.0f, -1.0f, -1.0f, // left
-1.0f, -1.0f, 1.0f,
-1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, -1.0f, -1.0f, // bottom
1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, 1.0f,
1.0f, -1.0f, 1.0f,
-1.0f, 1.0f, -1.0f, // top
1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f
};
float texBuffer[] =
{
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f
};
byte indexBuffer[] =
{
0, 1, 3, 0, 3, 2,
4, 5, 7, 4, 7, 6,
8, 9, 11, 8, 11, 10,
12, 13, 15, 12, 15, 14,
16, 17, 19, 16, 19, 18,
20, 21, 23, 20, 23, 22
};
ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
mVertexBuffer = byteBuf.asFloatBuffer();
mVertexBuffer.put(vertices);
mVertexBuffer.position(0);
byteBuf = ByteBuffer.allocateDirect(texBuffer.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
myTexBuffer = byteBuf.asFloatBuffer();
myTexBuffer.put(texBuffer);
myTexBuffer.position(0);
myIndexBuffer = ByteBuffer.allocate(indexBuffer.length);
myIndexBuffer.put(indexBuffer);
myIndexBuffer.position(0);
}
// need to add functionality to only draw viewable/outside textures
public void draw(GL10 gl, int[] texture)
{
// enable vertex and texture states
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// set the font face rotation
gl.glFrontFace(GL10.GL_CW);
// set the pointers to the buffers
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, myTexBuffer);
// step each face of the cube and attach a different texture to each side
for (int i = 0; i < 6; i++)
{
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[i]); // bind the textures
myIndexBuffer.position(6 * i); // step through the buffer
gl.glDrawElements(GL10.GL_TRIANGLES, 6, GL10.GL_UNSIGNED_BYTE, myIndexBuffer);
}
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
}
}
catlog中错误消息的前几行是:
JNI在应用程序中检测到错误:元素指针0x12ce4382无效,数组元素为0x12ce437c
in call to ReleaseArrayElements
from void com.google.android.gles_jni.GLImpl.glDrawElements(int, int, int, java.nio.Buffer)
“GLThread 147”优先级=5 tid=12可运行
|组=“main”scont=0 dsCount=0 obj=0x12c72430 self=0xae286400
|sysTid=2100好=0 cgrp=默认sched=0/0句柄=0xb4559f00
|state=R调度=(0 0 0)utm=1 stm=16 core=0 HZ=100
|堆栈=0xa6832000-0xa6834000堆栈大小=1036KB
|保持的互斥量=“mutator lock”(共享保持)
它通过for循环的第一次迭代OK。在第二次通过时,应用程序在glDrawElements行崩溃。为什么这在KitKat Android 4.4上没有故障,在Lollipop、Android 5.0上崩溃?我需要做些什么才能让我的代码与Lollipop一起工作?
使用allocateDirect分配索引缓冲区:
myIndexBuffer = ByteBuffer.allocateDirect(indexBuffer.length);
传递给OpenGLES的所有缓冲区都应该是直接缓冲区。不过,我不知道为什么它会在Kit Kat上工作,也许有些东西在幕后得到了优化,现在它有所不同。
我使用矢量绘图在Android之前Lollipop和这些是我的一些库和工具版本: Android Studio: 2.0 AndroidGradle插件 构建工具:23.0.2 Android支持库:23.3.0 我在我的应用级别 还值得一提的是,我使用一个额外的绘图,如LayerDrawable(layer_list),如Android官方博客中所述(链接此处),用于为 你会发现直接引用应用程序
进程:android.ul.com.ulinAppChatDemo,PID:2840 java.lang.RuntimeException:无法获取提供程序android.arch.lifecycle.processLifecycleOwnerInitializer:java.lang.ClassNotFoundException:在路径:DexPathList[[zip文件“/data/app/
问题内容: 当使用Lucene为文档建立索引时,我的JVM(1.6.0_29)在频繁使用时始终崩溃。我得到: 环境: JDK:1.6u29(与1.6_02相同的问题)Lucene版本3.4.0 vm_info:适用于linux-amd64 JRE(1.6.0_29-b11)的Java HotSpot(TM)64位服务器VM(20.4-b02),由“ java_re”于gcc 3.2.2于2011年
我一直在尝试将. ttf字体添加到我的android移动应用程序中。我正在使用Libgdx引擎创建我的应用程序,并尝试添加True Type扩展以允许使用. ttf字体。这是我正在运行以尝试创建字体的代码。 当我调用这段代码时,我的应用程序会给我消息,没有其他信息。我已经在核心和android项目中包含了和。我已经单击了在这两个项目上导出它们的选项。我已经在和文件夹中包含了两个文件。 谁能告诉我为
在Windows Phone8(诺基亚Lumia520)上调试应用程序时,我面临崩溃,我不知道为什么。游戏在Unity中开发,最初针对iOS和Android,现在被移植到WP8。失败发生在单步执行我的脚本之前,并且处理程序也无法到达。 调试器(仅本机)设置为在引发异常且用户未处理时中断。第一次调用堆栈是: 环境: Windows Pro 8.1 64位 Unity Pro 4.3.1F1 Micr
每次我打开Aptana它都会崩溃。 Java运行时环境检测到一个致命错误: 如果您想提交错误报告,请访问:http://bugreport.sun.com/bugreport/crash.jsp崩溃发生在Java虚拟机之外的本机代码中。有关报告错误的位置,请参见问题框。