私は、同じように動作するはずの 3 つのコードの断片を持っていますが、OpenGL ES が Java for Android にどのようにバインドされているかをまだ調査中です。ただし、フラグメント B と C の動作が異なる理由を知りたいです。
次の (A) は機能します。
ByteBuffer bb = ByteBuffer.allocateDirect(8);
bb.order(ByteOrder.nativeOrder());
IntBuffer ib = bb.asIntBuffer();
Log.d("Info", "Generating buffers...");
GLES20.glGenBuffers(2, ib);
Log.d("Info", "Done!");
int buff1 = ib.get();
int buff2 = ib.get();
Log.d("A) buff1", String.format("%d", buff1));
Log.d("A) buff2", String.format("%d", buff2));
次の (B) は機能せず、glGenBuffers で SIGSEGV が発生します。前のものとの唯一の違いは、allocateDirect ではなく、allocate 呼び出しにあることに注意してください。
ByteBuffer bb = ByteBuffer.allocate(8);
bb.order(ByteOrder.nativeOrder());
IntBuffer ib = bb.asIntBuffer();
Log.d("Info", "Generating buffers...");
GLES20.glGenBuffers(2, ib);
Log.d("Info", "Done!");
int buff1 = ib.get();
int buff2 = ib.get();
Log.d("B) buff1", String.format("%d", buff1));
Log.d("B) buff2", String.format("%d", buff2));
次の (C) は機能しますが、これもまた、allocateDirect ではなく、allocate の呼び出しであるため、本当に驚きました。
IntBuffer ib = IntBuffer.allocate(2);
Log.d("Info", "Generating buffers...");
GLES20.glGenBuffers(2, ib);
Log.d("Info", "Done!");
int buff1 = ib.get();
int buff2 = ib.get();
Log.d("C) buff1", String.format("%d", buff1));
Log.d("C) buff2", String.format("%d", buff2));
「動作する」という言葉は、ログにエラーが表示されず、buff1 と buff2 が 70001、140002、または 210004 のような正の「妥当な」値を取得することを意味します。これらは名前のように見えます。