我有三个代码片段应该表现相似,或者可能不是,我还在研究OpenGL ES如何绑定到Android for Java。但是我真的想知道为什么片段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:
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)有效,这让我感到很惊讶,因为它再次调用分配而不是分配直接:
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));
使用“works”这个词我的意思是在日志中没有出现错误,buff1和buff2得到正的“合理”值,如70001,140002或210004,看起来它们可能是名字。