Страницы

Поиск по вопросам

среда, 4 марта 2020 г.

JNI DETECTED ERROR IN APPLICATION: jarray was NULL

#java #android #opengles


Всем привет, у меня возникла ошибка вот в этом куске кода :

GLES30.glGenVertexArrays(1, vao, 0);

GLES30.glBindVertexArray(vao[0]);

int[] vbo = new int[1];
int[] vbo_indices = new int[1];
GLES20.glGenBuffers(1, vbo, 0);
GLES20.glGenBuffers(1, vbo_indices, 0);

FloatBuffer posBuffer = BufferUtils.createFloatBuffer(positions.length);
posBuffer.put(positions);
posBuffer.position(0);

GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vbo[0]);
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, positions.length * 4, posBuffer, GLES30.GL_STATIC_DRAW);
GLES30.glVertexAttribPointer(0, 3, GLES30.GL_FLOAT, false, 0, 0);
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0);

IntBuffer indicesBuf = BufferUtils.createIntBuffer(indices.length);
indicesBuf.put(indices);
indicesBuf.position(0);

GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, vbo_indices[0]);
GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER, indicesBuf.capacity() * 4, indicesBuf,
GLES30.GL_STATIC_DRAW);
GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, 0);

zGLES30.glBindVertexArray(0);


Если точнее, то в :

GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER, indicesBuf.capacity() * 4, indicesBuf,
GLES30.GL_STATIC_DRAW);GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER, indicesBuf.capacity()
* 4, indicesBuf, GLES30.GL_STATIC_DRAW);


Вот сама ошибка :

JNI DETECTED ERROR IN APPLICATION: jarray was NULL
in call to GetPrimitiveArrayCritical
from void android.opengl.GLES20.glBufferData(int, int, java.nio.Buffer, int)


Вот еще функция crateIntBuffer: 

public static IntBuffer createIntBuffer(int numInts) {
    ByteBuffer buffer = ByteBuffer.allocate(numInts * 4);
    buffer.order(ByteOrder.nativeOrder());
    return buffer.asIntBuffer();
}


Прошу тех кто знает в чем проблема помочь, заранее спасибою.
    


Ответы

Ответ 1



Используйте ByteBuffer.allocateDirect(...) в BufferUtils.createFloatBuffer(positions.length); Проблема в том, что glBufferData требует direct-буфер, который можно эффективно использовать совместно с нативным кодом. Если же используется ByteBuffer.allocate(...) или что-то вроде FloatBuffer.wrap(...), то это не будет direct-буфером. Поэтому надо использовать ByteBuffer.allocateDirect(...) для выделения буфера и ByteBuffer.put(...) для его инициализации.

Комментариев нет:

Отправить комментарий