1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2008 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker import java.nio.BufferOverflowException; 18*795d594fSAndroid Build Coastguard Worker import java.nio.ByteBuffer; 19*795d594fSAndroid Build Coastguard Worker import java.nio.ByteOrder; 20*795d594fSAndroid Build Coastguard Worker import java.nio.CharBuffer; 21*795d594fSAndroid Build Coastguard Worker import java.nio.DoubleBuffer; 22*795d594fSAndroid Build Coastguard Worker import java.nio.FloatBuffer; 23*795d594fSAndroid Build Coastguard Worker import java.nio.IntBuffer; 24*795d594fSAndroid Build Coastguard Worker import java.nio.LongBuffer; 25*795d594fSAndroid Build Coastguard Worker import java.nio.ShortBuffer; 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker public class Main { main(String[] args)28*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 29*795d594fSAndroid Build Coastguard Worker ByteBuffer buf = ByteBuffer.allocateDirect(16); 30*795d594fSAndroid Build Coastguard Worker System.out.println("Direct byte buffer has array: " + buf.hasArray()); 31*795d594fSAndroid Build Coastguard Worker 32*795d594fSAndroid Build Coastguard Worker intFloatTest(); 33*795d594fSAndroid Build Coastguard Worker basicShortTest(); 34*795d594fSAndroid Build Coastguard Worker primTest(); 35*795d594fSAndroid Build Coastguard Worker } 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker /* 38*795d594fSAndroid Build Coastguard Worker * Create a buffer and fiddle with it. 39*795d594fSAndroid Build Coastguard Worker */ basicShortTest()40*795d594fSAndroid Build Coastguard Worker public static void basicShortTest() { 41*795d594fSAndroid Build Coastguard Worker ByteBuffer directBuf = ByteBuffer.allocateDirect(64); 42*795d594fSAndroid Build Coastguard Worker //ByteBuffer directBuf = ByteBuffer.allocateDirect(65); 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Worker ShortBuffer shortBuf = directBuf.asShortBuffer(); 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker short[] myShorts = { 47*795d594fSAndroid Build Coastguard Worker 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 48*795d594fSAndroid Build Coastguard Worker 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 49*795d594fSAndroid Build Coastguard Worker 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 50*795d594fSAndroid Build Coastguard Worker 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031 51*795d594fSAndroid Build Coastguard Worker }; 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Worker shortBuf.position(0); 54*795d594fSAndroid Build Coastguard Worker shortBuf.put(myShorts, 0, 32); // should work 55*795d594fSAndroid Build Coastguard Worker shortBuf.position(0); 56*795d594fSAndroid Build Coastguard Worker shortBuf.put(myShorts, 16, 16); // should work 57*795d594fSAndroid Build Coastguard Worker shortBuf.put(myShorts, 16, 16); // advance to end 58*795d594fSAndroid Build Coastguard Worker 59*795d594fSAndroid Build Coastguard Worker try { 60*795d594fSAndroid Build Coastguard Worker shortBuf.put(myShorts, 0, 1); // should fail 61*795d594fSAndroid Build Coastguard Worker System.out.println("ERROR: out-of-bounds put succeeded\n"); 62*795d594fSAndroid Build Coastguard Worker } catch (BufferOverflowException boe) { 63*795d594fSAndroid Build Coastguard Worker System.out.println("Got expected buffer overflow exception"); 64*795d594fSAndroid Build Coastguard Worker } 65*795d594fSAndroid Build Coastguard Worker 66*795d594fSAndroid Build Coastguard Worker try { 67*795d594fSAndroid Build Coastguard Worker shortBuf.position(0); 68*795d594fSAndroid Build Coastguard Worker shortBuf.put(myShorts, 0, 33); // should fail 69*795d594fSAndroid Build Coastguard Worker System.out.println("ERROR: out-of-bounds put succeeded\n"); 70*795d594fSAndroid Build Coastguard Worker } catch (IndexOutOfBoundsException ioobe) { 71*795d594fSAndroid Build Coastguard Worker System.out.println("Got expected out-of-bounds exception"); 72*795d594fSAndroid Build Coastguard Worker } 73*795d594fSAndroid Build Coastguard Worker 74*795d594fSAndroid Build Coastguard Worker try { 75*795d594fSAndroid Build Coastguard Worker shortBuf.position(16); 76*795d594fSAndroid Build Coastguard Worker shortBuf.put(myShorts, 0, 17); // should fail 77*795d594fSAndroid Build Coastguard Worker System.out.println("ERROR: out-of-bounds put succeeded\n"); 78*795d594fSAndroid Build Coastguard Worker } catch (BufferOverflowException boe) { 79*795d594fSAndroid Build Coastguard Worker System.out.println("Got expected buffer overflow exception"); 80*795d594fSAndroid Build Coastguard Worker } 81*795d594fSAndroid Build Coastguard Worker } 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker /* 84*795d594fSAndroid Build Coastguard Worker * Try this with either floats or ints; ints fail with 85*795d594fSAndroid Build Coastguard Worker * BufferOverflowException, floats work. 86*795d594fSAndroid Build Coastguard Worker * 87*795d594fSAndroid Build Coastguard Worker * From http://code.google.com/p/android/issues/detail?id=1585 . 88*795d594fSAndroid Build Coastguard Worker */ intFloatTest()89*795d594fSAndroid Build Coastguard Worker public static void intFloatTest() { 90*795d594fSAndroid Build Coastguard Worker ByteBuffer direct = ByteBuffer.allocateDirect(100); 91*795d594fSAndroid Build Coastguard Worker direct.order(ByteOrder.nativeOrder()); 92*795d594fSAndroid Build Coastguard Worker IntBuffer int1 = direct.asIntBuffer(); 93*795d594fSAndroid Build Coastguard Worker int data[] = new int[25]; 94*795d594fSAndroid Build Coastguard Worker //FloatBuffer int1 = direct.asFloatBuffer(); 95*795d594fSAndroid Build Coastguard Worker //float data[] = new float[25]; 96*795d594fSAndroid Build Coastguard Worker int1.clear (); 97*795d594fSAndroid Build Coastguard Worker int1.put (data); 98*795d594fSAndroid Build Coastguard Worker int1.position (0); 99*795d594fSAndroid Build Coastguard Worker 100*795d594fSAndroid Build Coastguard Worker int1.clear (); 101*795d594fSAndroid Build Coastguard Worker int1.put (data); 102*795d594fSAndroid Build Coastguard Worker int1.position (0); 103*795d594fSAndroid Build Coastguard Worker } 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker /* 106*795d594fSAndroid Build Coastguard Worker * Exercise all "view buffer" classes, in both byte orders. 107*795d594fSAndroid Build Coastguard Worker */ primTest()108*795d594fSAndroid Build Coastguard Worker public static void primTest() { 109*795d594fSAndroid Build Coastguard Worker ByteBuffer directBuf = ByteBuffer.allocateDirect(36); 110*795d594fSAndroid Build Coastguard Worker directBuf.order(ByteOrder.BIG_ENDIAN); 111*795d594fSAndroid Build Coastguard Worker storeValues(directBuf); 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 36; i++) { 114*795d594fSAndroid Build Coastguard Worker directBuf.put(i, (byte) 0xcc); 115*795d594fSAndroid Build Coastguard Worker } 116*795d594fSAndroid Build Coastguard Worker 117*795d594fSAndroid Build Coastguard Worker directBuf.order(ByteOrder.LITTLE_ENDIAN); 118*795d594fSAndroid Build Coastguard Worker storeValues(directBuf); 119*795d594fSAndroid Build Coastguard Worker } 120*795d594fSAndroid Build Coastguard Worker storeValues(ByteBuffer directBuf)121*795d594fSAndroid Build Coastguard Worker static void storeValues(ByteBuffer directBuf) { 122*795d594fSAndroid Build Coastguard Worker directBuf.position(0); 123*795d594fSAndroid Build Coastguard Worker ShortBuffer shortBuf = directBuf.asShortBuffer(); 124*795d594fSAndroid Build Coastguard Worker CharBuffer charBuf = directBuf.asCharBuffer(); 125*795d594fSAndroid Build Coastguard Worker IntBuffer intBuf = directBuf.asIntBuffer(); 126*795d594fSAndroid Build Coastguard Worker FloatBuffer floatBuf = directBuf.asFloatBuffer(); 127*795d594fSAndroid Build Coastguard Worker LongBuffer longBuf = directBuf.asLongBuffer(); 128*795d594fSAndroid Build Coastguard Worker DoubleBuffer doubleBuf = directBuf.asDoubleBuffer(); 129*795d594fSAndroid Build Coastguard Worker 130*795d594fSAndroid Build Coastguard Worker final byte byteValue = -5; 131*795d594fSAndroid Build Coastguard Worker final short shortValue = -1234; 132*795d594fSAndroid Build Coastguard Worker final char charValue = 49200; 133*795d594fSAndroid Build Coastguard Worker final int intValue = 0x12345678; 134*795d594fSAndroid Build Coastguard Worker final float floatValue = 3.14159f; 135*795d594fSAndroid Build Coastguard Worker final long longValue = 0x1122334455667788L; 136*795d594fSAndroid Build Coastguard Worker final double doubleValue = Double.MIN_VALUE; 137*795d594fSAndroid Build Coastguard Worker 138*795d594fSAndroid Build Coastguard Worker if (directBuf.put(1, byteValue).get(1) != byteValue) { 139*795d594fSAndroid Build Coastguard Worker throw new RuntimeException("byte get/store failed"); 140*795d594fSAndroid Build Coastguard Worker } 141*795d594fSAndroid Build Coastguard Worker if (shortBuf.put(1, shortValue).get(1) != shortValue) { 142*795d594fSAndroid Build Coastguard Worker throw new RuntimeException("short get/store failed"); 143*795d594fSAndroid Build Coastguard Worker } 144*795d594fSAndroid Build Coastguard Worker if (charBuf.put(2, charValue).get(2) != charValue) { 145*795d594fSAndroid Build Coastguard Worker throw new RuntimeException("char get/store failed"); 146*795d594fSAndroid Build Coastguard Worker } 147*795d594fSAndroid Build Coastguard Worker if (intBuf.put(2, intValue).get(2) != intValue) { 148*795d594fSAndroid Build Coastguard Worker throw new RuntimeException("int get/store failed"); 149*795d594fSAndroid Build Coastguard Worker } 150*795d594fSAndroid Build Coastguard Worker if (floatBuf.put(3, floatValue).get(3) != floatValue) { 151*795d594fSAndroid Build Coastguard Worker throw new RuntimeException("float get/store failed"); 152*795d594fSAndroid Build Coastguard Worker } 153*795d594fSAndroid Build Coastguard Worker if (longBuf.put(2, longValue).get(2) != longValue) { 154*795d594fSAndroid Build Coastguard Worker throw new RuntimeException("long get/store failed"); 155*795d594fSAndroid Build Coastguard Worker } 156*795d594fSAndroid Build Coastguard Worker if (doubleBuf.put(3, doubleValue).get(3) != doubleValue) { 157*795d594fSAndroid Build Coastguard Worker throw new RuntimeException("double get/store failed"); 158*795d594fSAndroid Build Coastguard Worker } 159*795d594fSAndroid Build Coastguard Worker 160*795d594fSAndroid Build Coastguard Worker directBuf.position(0); 161*795d594fSAndroid Build Coastguard Worker char[] outBuf = new char[directBuf.limit() * 2]; 162*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < directBuf.limit(); i++) { 163*795d594fSAndroid Build Coastguard Worker byte b = directBuf.get(); 164*795d594fSAndroid Build Coastguard Worker outBuf[i*2] = hexChar((byte) ((b >> 4) & 0x0f)); 165*795d594fSAndroid Build Coastguard Worker outBuf[i*2+1] = hexChar((byte) (b & 0x0f)); 166*795d594fSAndroid Build Coastguard Worker } 167*795d594fSAndroid Build Coastguard Worker System.out.println(new String(outBuf)); 168*795d594fSAndroid Build Coastguard Worker } 169*795d594fSAndroid Build Coastguard Worker hexChar(byte b)170*795d594fSAndroid Build Coastguard Worker static char hexChar(byte b) { 171*795d594fSAndroid Build Coastguard Worker if (b < 10) { 172*795d594fSAndroid Build Coastguard Worker return (char) ('0' + b); 173*795d594fSAndroid Build Coastguard Worker } else { 174*795d594fSAndroid Build Coastguard Worker return (char) ('a' + b - 10); 175*795d594fSAndroid Build Coastguard Worker } 176*795d594fSAndroid Build Coastguard Worker } 177*795d594fSAndroid Build Coastguard Worker } 178