I think (i.e. I'm not 100% sure), that when you cast a Java byte to an int, it becomes a signed int (-127 to 128 or something). This would mean that this:
((_data.get(bindex)<<16) ) + ((_data.get(bindex+1) << 8) ) +((_data.get(bindex+2)<<0 ) )
is not quite what you need since you need to get the byte in the range of 0 to 255 before doing the bit shifting.
Also, this might be related to your problem:
_data = ByteBuffer.allocateDirect(500 * 500 * 3).order(ByteOrder.LITTLE_ENDIAN);//.order(ByteOrder.LITTLE_ENDIAN).asIntBuffer();
probably should be have .order(ByteOrder.nativeOrder()) instead (or use the BufferUtils method to create the buffer).