当前位置: 首页 > 知识库问答 >
问题:

gldrawerelements()崩溃Lollipop,但在KitKat上还行

董畅
2023-03-14

我正在尝试学习适用于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一起工作?

共有1个答案

段溪叠
2023-03-14

使用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虚拟机之外的本机代码中。有关报告错误的位置,请参见问题框。