Unexpected behavior of Buffers in Honeycomb(Android 3.0)
//...
//We put some float values in the buffer
//...
//...
//use the values in copiedBuffer
//...
ByteBuffer byteBuffer0 =
ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder());
FloatBuffer buffer0 = byteBuffer0.asFloatBuffer(); buffer0.put(0.1f); FloatBuffer copiedBuffer0 = buffer0.asReadOnlyBuffer(); Log.d(TAG, "buffer0 endian: " + buffer0.order()); Log.d(TAG, "buffer0[0]: " + buffer0.get(0)); Log.d(TAG, "copiedBuffer0 endian: " + copiedBuffer0.order()); Log.d(TAG, "copiedBuffer0[0]: " + copiedBuffer0.get(0)); ByteBuffer byteBuffer1 =
ByteBuffer.allocate(4).order(ByteOrder.nativeOrder());
FloatBuffer buffer1 = byteBuffer1.asFloatBuffer(); buffer1.put(0.1f); FloatBuffer copiedBuffer1 = buffer1.asReadOnlyBuffer(); Log.d(TAG, "buffer1 endian: " + buffer1.order()); Log.d(TAG, "buffer1[0]: " + buffer1.get(0)); Log.d(TAG, "copiedBuffer1 endian: " + copiedBuffer1.order()); Log.d(TAG, "copiedBuffer1[0]: " + copiedBuffer1.get(0)); FloatBuffer buffer2 = ByteBuffer.allocateDirect(4).asFloatBuffer(); buffer2.put(0.1f); FloatBuffer copiedBuffer2 = buffer2.asReadOnlyBuffer(); Log.d(TAG, "buffer2 endian: " + buffer2.order()); Log.d(TAG, "buffer2[0]: " + buffer2.get(0)); Log.d(TAG, "copiedBuffer2 endian: " + copiedBuffer2.order()); Log.d(TAG, "copiedBuffer2[0]: " + copiedBuffer2.get(0)); FloatBuffer buffer3 = ByteBuffer.allocate(4).asFloatBuffer(); buffer3.put(0.1f); FloatBuffer copiedBuffer3 = buffer3.asReadOnlyBuffer(); Log.d(TAG, "buffer3 endian: " + buffer3.order()); Log.d(TAG, "buffer3[0]: " + buffer3.get(0)); Log.d(TAG, "copiedBuffer3 endian: " + copiedBuffer3.order()); Log.d(TAG, "copiedBuffer3[0]: " + copiedBuffer3.get(0));
buffer0 endian: LITTLE_ENDIAN
buffer0[0]: 0.1
copiedBuffer0 endian: BIG_ENDIAN
copiedBuffer0[0]: -4.2949213E8
buffer1 endian: LITTLE_ENDIAN
buffer1[0]: 0.1
copiedBuffer1 endian: BIG_ENDIAN
copiedBuffer1[0]: -4.2949213E8
buffer2 endian: BIG_ENDIAN
buffer2[0]: 0.1
copiedBuffer2 endian: BIG_ENDIAN
copiedBuffer2[0]: 0.1
buffer3 endian: BIG_ENDIAN
buffer3[0]: 0.1
copiedBuffer3 endian: BIG_ENDIAN
copiedBuffer3[0]: 0.1
buffer0 endian: LITTLE_ENDIAN
buffer0[0]: 0.1
copiedBuffer0 endian: LITTLE_ENDIAN
copiedBuffer0[0]: 0.1
buffer1 endian: LITTLE_ENDIAN
buffer1[0]: 0.1
copiedBuffer1 endian: LITTLE_ENDIAN
copiedBuffer1[0]: 0.1
buffer2 endian: BIG_ENDIAN
buffer2[0]: 0.1
copiedBuffer2 endian: BIG_ENDIAN
copiedBuffer2[0]: 0.1
buffer3 endian: BIG_ENDIAN
buffer3[0]: 0.1
copiedBuffer3 endian: BIG_ENDIAN
copiedBuffer3[0]: 0.1
So, here is my conclusion. Dalvik uses big endian and Linux which is the operating system I am using at work uses little endian. As a result, ByteBuffers are created to use big endian by default. However, when the ByteOrder is specified to be little endian, the Order property isn't properly copied to the new Buffer in Honeycomb. I suspect that this is a bug in Honeycomb because Honeycomb is the only Android version working differently and also it doesn't logically make sense to use a different endian system to interpret a copied buffer from the original buffer. Moreover, the Order property not being properly copied seems much like a mistake since you cannot set the Order property for FloatBuffers.
I must admit that specifying the ByteOrder of the buffer is an unnecessary step, still Honeycomb's behavior of handling Buffers doesn't make much sense.
'Information > Programming' 카테고리의 다른 글
생활코딩 오프라인 수업 작심삼일 후기 (0) | 2013.09.04 |
---|---|
[OpenGL] More on texture problem on Galaxy Player GB70 (0) | 2012.07.11 |
[OpenGL] When textures do not show properly without any glerror in Android (0) | 2012.07.10 |
Honeycomb bug on Buffer's have been fixed (0) | 2011.04.11 |
[Android] When onTouch() always leads to onLongClick() (0) | 2010.11.25 |
Don't mess with the iterator in the for-each loop body... (4) | 2010.06.22 |
Hardware Sensor Simulator for Android Emulator (1) | 2010.02.28 |
The Mythical Man-Month Chapter 3 (0) | 2009.10.21 |
The Mythical Man-Month Chapter 2 (1) | 2009.10.08 |
심심해서 테트리스를 짜보다... (13) | 2009.09.17 |