You realize 0x10000 is 65536 not 65535????
On Apr 29, 8:14 am, MichaelEGR <foun...@egrsoftware.com> wrote: > Some more clarification... The byte order is not preserved with > duplicate(), slice() and potentially other NIO methods, but those two > for sure. > > So if you have a FloatBuffer w/ native byte order of LITTLE_ENDIAN > call duplicate() on it will result in a view with BIG_ENDIAN byte > order on Honeycomb. > > Be careful. This could break a lot of 3rd party APIs that even > moderately use the functionality of NIO. > > Here is the output of the test app above with addition of showing byte > order: > > "duplicate()" on the desktop / J2SE 5.0 and the G2x / > Android 2.2 maintain byte order: > > NIOTest ---------- > Native ByteOrder: LITTLE_ENDIAN > buffer byte order: LITTLE_ENDIAN > buffer2 byte order: LITTLE_ENDIAN > bufferWrite2 byte order: LITTLE_ENDIAN > buffer.get(): 65536 > buffer2.get(): 65536 > > On the G-Slate / Honeycomb: > > NIOTest ---------- > Native ByteOrder: LITTLE_ENDIAN > buffer byte order: LITTLE_ENDIAN > buffer2 byte order: LITTLE_ENDIAN > bufferWrite2 byte order: BIG_ENDIAN > buffer.get(): 65536 > buffer2.get(): 256 > > If you must call duplicate() you should do it on the ByteBuffer and > explicitly call order(<byte order>). The following code is how I > create a duplicate FloatBuffer now for a "read / write head" on the > buffer > > ----------- > > ByteBuffer tempBuffer = direct ? > ByteBuffer.allocateDirect(capacity * s_SIZE_OF_FLOAT) : > ByteBuffer.allocate(capacity * s_SIZE_OF_FLOAT);; > > buffer1 = nativeOrder ? > tempBuffer.order(ByteOrder.nativeOrder()).asFloatBuffer() : > tempBuffer.asFloatBuffer(); > > read = nativeOrder ? > tempBuffer.asReadOnlyBuffer().order(ByteOrder.nativeOrder()).asFloatBuffer( ) > : > tempBuffer.asReadOnlyBuffer().asFloatBuffer(); > > write = nativeOrder ? > tempBuffer.duplicate().order(ByteOrder.nativeOrder()).asFloatBuffer() : > tempBuffer.duplicate().asFloatBuffer(); > > ----------- > > Apparently this will be fixed in ICS. Be warned though this > potentially can break a lot of code that depends on NIO. > > Regards, > --Mike > > On Apr 28, 3:22 pm, MichaelEGR <foun...@egrsoftware.com> wrote: > > > > > Greets, > > > I found a critical Java NIO flaw in Honeycomb / Android 3.0. > > > If "duplicate()" is called on a Buffer and that duplicate view is used > > to write to the buffer data integrity is not guaranteed. This is a > > regression for Honeycomb only at this point. > > > I got stuck with a ~45 hour debug cycle to catch this as it affected > > my usage of the NIO and the OpenGL ES API resulting in no rendering > > due to bad data. Unfortunately any usage of the NIO API and > > duplicate() will cause problems regardless if it's networking, other > > JNI usage, etc. This is a critical NIO flaw. > > > Please vote for this issue as it's critical and could affect a lot of > > code out there; not just mine... > > >http://code.google.com/p/android/issues/detail?id=16434&colspec=ID%20... > > > For fun you can read about the "pain and horror" this caused me: > > >http://groups.google.com/group/android-developers/browse_thread/threa... > > > Test Example: > > > On all Java / J2SE platforms 1.4, 5.0, 6.0 and Android OS version 1.0 > > - 2.3 the value of index 1 of buffer & buffer2 is 0x10000 (65535). On > > Android 3.0 / Honeycomb index 1 of buffer is 65535 and buffer 2 is > > 256.. Clearly a major if not critical flaw in Honeycomb for usage of > > the NIO API and calling duplicate() on a Buffer. Any code using NIO > > and duplicate() will likely break on Honeycomb. > > > --------------------- > > > package > > com.egrsoftware.niotest; > > > import > > java.nio.ByteBuffer; > > import > > java.nio.ByteOrder; > > import > > java.nio.IntBuffer; > > > / > > ** > > * NIOTest - Extremely simple unit test that Google should include in > > Android because it catches a bug in NIO that is > > * found in Android 3.0 / Honeycomb. This is a really nefarious bug as > > the affected code could be networking code, any > > * native JNI code, or in my case 3D rendering via the Android OpenGL > > ES API. Any code using NIO and "duplicate()" is > > * > > broken. > > > * > > * On all Java platforms with NIO and Android versions 1.0 to 2.3 both > > buffers should print out 65535. On Android / > > * Honeycomb the 1st value in buffer 1 is 65535 and buffer 2 is > > 256!!!! Clearly a bug that any simple unit testing > > * should have found. This bug affects _ALL_ code that uses the NIO > > duplicate() method on a Buffer. The fall out of > > * this is immense! This is a critical > > bug! > > > */ > > public class > > NIOTest > > { > > private static int s_SIZE_OF_INT = > > 4; > > > public static void > > test() > > > { > > IntBuffer buffer = ByteBuffer.allocateDirect(1 * > > s_SIZE_OF_INT).order( > > > ByteOrder.nativeOrder()).asIntBuffer(); > > > IntBuffer buffer2 = ByteBuffer.allocateDirect(1 * > > s_SIZE_OF_INT).order( > > > ByteOrder.nativeOrder()).asIntBuffer(); > > > IntBuffer bufferWrite2 = > > buffer2.duplicate(); > > > buffer.put(0, 0x10000); //put > > 65535 > > bufferWrite2.put(0, > > 0x10000); > > > System.err.println("NIOTest > > ----------"); > > System.err.println("buffer.get(): " > > +buffer.get()); > > System.err.println("buffer2.get(): " > > +buffer2.get()); > > } > > > public static void main(String > > args[]) > > > { > > > test(); > > } > > > }- Hide quoted text - > > - Show quoted text - -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en