1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2018 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.lang.invoke.MethodHandle; 18*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodHandles; 19*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodType; 20*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.VarHandle; 21*795d594fSAndroid Build Coastguard Worker import java.nio.ByteBuffer; 22*795d594fSAndroid Build Coastguard Worker import java.nio.ByteOrder; 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker public class VarHandleUnitTestHelpers { isRunningOnAndroid()25*795d594fSAndroid Build Coastguard Worker public static boolean isRunningOnAndroid() { 26*795d594fSAndroid Build Coastguard Worker return System.getProperty("java.vm.vendor").contains("Android"); 27*795d594fSAndroid Build Coastguard Worker } 28*795d594fSAndroid Build Coastguard Worker is64Bit()29*795d594fSAndroid Build Coastguard Worker public static boolean is64Bit() { 30*795d594fSAndroid Build Coastguard Worker // The behaviour of certain accessors depends on the ISA word size. 31*795d594fSAndroid Build Coastguard Worker if (isRunningOnAndroid()) { 32*795d594fSAndroid Build Coastguard Worker try { 33*795d594fSAndroid Build Coastguard Worker Class<?> runtimeClass = Class.forName("dalvik.system.VMRuntime"); 34*795d594fSAndroid Build Coastguard Worker MethodHandle getRuntimeMH = 35*795d594fSAndroid Build Coastguard Worker MethodHandles.lookup() 36*795d594fSAndroid Build Coastguard Worker .findStatic( 37*795d594fSAndroid Build Coastguard Worker runtimeClass, 38*795d594fSAndroid Build Coastguard Worker "getRuntime", 39*795d594fSAndroid Build Coastguard Worker MethodType.methodType(runtimeClass)); 40*795d594fSAndroid Build Coastguard Worker Object runtime = getRuntimeMH.invoke(); 41*795d594fSAndroid Build Coastguard Worker MethodHandle is64BitMH = 42*795d594fSAndroid Build Coastguard Worker MethodHandles.lookup() 43*795d594fSAndroid Build Coastguard Worker .findVirtual( 44*795d594fSAndroid Build Coastguard Worker runtimeClass, 45*795d594fSAndroid Build Coastguard Worker "is64Bit", 46*795d594fSAndroid Build Coastguard Worker MethodType.methodType(boolean.class)); 47*795d594fSAndroid Build Coastguard Worker return (boolean) is64BitMH.invoke(runtime); 48*795d594fSAndroid Build Coastguard Worker } catch (Throwable t) { 49*795d594fSAndroid Build Coastguard Worker throw new RuntimeException(t); 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker } else { 52*795d594fSAndroid Build Coastguard Worker return System.getProperty("sun.arch.data.model").equals("64"); 53*795d594fSAndroid Build Coastguard Worker } 54*795d594fSAndroid Build Coastguard Worker } 55*795d594fSAndroid Build Coastguard Worker createFilledByteArray(int size)56*795d594fSAndroid Build Coastguard Worker public static byte[] createFilledByteArray(int size) { 57*795d594fSAndroid Build Coastguard Worker byte[] array = new byte[size]; 58*795d594fSAndroid Build Coastguard Worker for (int i = 0; i != size; ++i) { 59*795d594fSAndroid Build Coastguard Worker array[i] = (byte) (i * 47 + 11); 60*795d594fSAndroid Build Coastguard Worker } 61*795d594fSAndroid Build Coastguard Worker return array; 62*795d594fSAndroid Build Coastguard Worker } 63*795d594fSAndroid Build Coastguard Worker getBytesAs_boolean(byte[] array, int index, ByteOrder order)64*795d594fSAndroid Build Coastguard Worker public static boolean getBytesAs_boolean(byte[] array, int index, ByteOrder order) { 65*795d594fSAndroid Build Coastguard Worker return getBytesAs_boolean(ByteBuffer.wrap(array), index, order); 66*795d594fSAndroid Build Coastguard Worker } 67*795d594fSAndroid Build Coastguard Worker getBytesAs_byte(byte[] array, int index, ByteOrder order)68*795d594fSAndroid Build Coastguard Worker public static byte getBytesAs_byte(byte[] array, int index, ByteOrder order) { 69*795d594fSAndroid Build Coastguard Worker return getBytesAs_byte(ByteBuffer.wrap(array), index, order); 70*795d594fSAndroid Build Coastguard Worker } 71*795d594fSAndroid Build Coastguard Worker getBytesAs_char(byte[] array, int index, ByteOrder order)72*795d594fSAndroid Build Coastguard Worker public static char getBytesAs_char(byte[] array, int index, ByteOrder order) { 73*795d594fSAndroid Build Coastguard Worker return getBytesAs_char(ByteBuffer.wrap(array), index, order); 74*795d594fSAndroid Build Coastguard Worker } 75*795d594fSAndroid Build Coastguard Worker getBytesAs_short(byte[] array, int index, ByteOrder order)76*795d594fSAndroid Build Coastguard Worker public static short getBytesAs_short(byte[] array, int index, ByteOrder order) { 77*795d594fSAndroid Build Coastguard Worker return getBytesAs_short(ByteBuffer.wrap(array), index, order); 78*795d594fSAndroid Build Coastguard Worker } 79*795d594fSAndroid Build Coastguard Worker getBytesAs_int(byte[] array, int index, ByteOrder order)80*795d594fSAndroid Build Coastguard Worker public static int getBytesAs_int(byte[] array, int index, ByteOrder order) { 81*795d594fSAndroid Build Coastguard Worker return getBytesAs_int(ByteBuffer.wrap(array), index, order); 82*795d594fSAndroid Build Coastguard Worker } 83*795d594fSAndroid Build Coastguard Worker getBytesAs_long(byte[] array, int index, ByteOrder order)84*795d594fSAndroid Build Coastguard Worker public static long getBytesAs_long(byte[] array, int index, ByteOrder order) { 85*795d594fSAndroid Build Coastguard Worker return getBytesAs_long(ByteBuffer.wrap(array), index, order); 86*795d594fSAndroid Build Coastguard Worker } 87*795d594fSAndroid Build Coastguard Worker getBytesAs_float(byte[] array, int index, ByteOrder order)88*795d594fSAndroid Build Coastguard Worker public static float getBytesAs_float(byte[] array, int index, ByteOrder order) { 89*795d594fSAndroid Build Coastguard Worker return getBytesAs_float(ByteBuffer.wrap(array), index, order); 90*795d594fSAndroid Build Coastguard Worker } 91*795d594fSAndroid Build Coastguard Worker getBytesAs_double(byte[] array, int index, ByteOrder order)92*795d594fSAndroid Build Coastguard Worker public static double getBytesAs_double(byte[] array, int index, ByteOrder order) { 93*795d594fSAndroid Build Coastguard Worker return getBytesAs_double(ByteBuffer.wrap(array), index, order); 94*795d594fSAndroid Build Coastguard Worker } 95*795d594fSAndroid Build Coastguard Worker getBytesAs_boolean(ByteBuffer buffer, int index, ByteOrder order)96*795d594fSAndroid Build Coastguard Worker public static boolean getBytesAs_boolean(ByteBuffer buffer, int index, ByteOrder order) { 97*795d594fSAndroid Build Coastguard Worker return buffer.order(order).get(index) != 0; 98*795d594fSAndroid Build Coastguard Worker } 99*795d594fSAndroid Build Coastguard Worker getBytesAs_byte(ByteBuffer buffer, int index, ByteOrder order)100*795d594fSAndroid Build Coastguard Worker public static byte getBytesAs_byte(ByteBuffer buffer, int index, ByteOrder order) { 101*795d594fSAndroid Build Coastguard Worker return buffer.order(order).get(index); 102*795d594fSAndroid Build Coastguard Worker } 103*795d594fSAndroid Build Coastguard Worker getBytesAs_char(ByteBuffer buffer, int index, ByteOrder order)104*795d594fSAndroid Build Coastguard Worker public static char getBytesAs_char(ByteBuffer buffer, int index, ByteOrder order) { 105*795d594fSAndroid Build Coastguard Worker return buffer.order(order).getChar(index); 106*795d594fSAndroid Build Coastguard Worker } 107*795d594fSAndroid Build Coastguard Worker getBytesAs_short(ByteBuffer buffer, int index, ByteOrder order)108*795d594fSAndroid Build Coastguard Worker public static short getBytesAs_short(ByteBuffer buffer, int index, ByteOrder order) { 109*795d594fSAndroid Build Coastguard Worker return buffer.order(order).getShort(index); 110*795d594fSAndroid Build Coastguard Worker } 111*795d594fSAndroid Build Coastguard Worker getBytesAs_int(ByteBuffer buffer, int index, ByteOrder order)112*795d594fSAndroid Build Coastguard Worker public static int getBytesAs_int(ByteBuffer buffer, int index, ByteOrder order) { 113*795d594fSAndroid Build Coastguard Worker return buffer.order(order).getInt(index); 114*795d594fSAndroid Build Coastguard Worker } 115*795d594fSAndroid Build Coastguard Worker getBytesAs_long(ByteBuffer buffer, int index, ByteOrder order)116*795d594fSAndroid Build Coastguard Worker public static long getBytesAs_long(ByteBuffer buffer, int index, ByteOrder order) { 117*795d594fSAndroid Build Coastguard Worker return buffer.order(order).getLong(index); 118*795d594fSAndroid Build Coastguard Worker } 119*795d594fSAndroid Build Coastguard Worker getBytesAs_float(ByteBuffer buffer, int index, ByteOrder order)120*795d594fSAndroid Build Coastguard Worker public static float getBytesAs_float(ByteBuffer buffer, int index, ByteOrder order) { 121*795d594fSAndroid Build Coastguard Worker return buffer.order(order).getFloat(index); 122*795d594fSAndroid Build Coastguard Worker } 123*795d594fSAndroid Build Coastguard Worker getBytesAs_double(ByteBuffer buffer, int index, ByteOrder order)124*795d594fSAndroid Build Coastguard Worker public static double getBytesAs_double(ByteBuffer buffer, int index, ByteOrder order) { 125*795d594fSAndroid Build Coastguard Worker return buffer.order(order).getDouble(index); 126*795d594fSAndroid Build Coastguard Worker } 127*795d594fSAndroid Build Coastguard Worker setBytesAs_boolean(byte[] array, int index, boolean value, ByteOrder order)128*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_boolean(byte[] array, int index, boolean value, ByteOrder order) { 129*795d594fSAndroid Build Coastguard Worker setBytesAs_boolean(ByteBuffer.wrap(array), index, value, order); 130*795d594fSAndroid Build Coastguard Worker } 131*795d594fSAndroid Build Coastguard Worker setBytesAs_byte(byte[] array, int index, byte value, ByteOrder order)132*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_byte(byte[] array, int index, byte value, ByteOrder order) { 133*795d594fSAndroid Build Coastguard Worker setBytesAs_byte(ByteBuffer.wrap(array), index, value, order); 134*795d594fSAndroid Build Coastguard Worker } 135*795d594fSAndroid Build Coastguard Worker setBytesAs_char(byte[] array, int index, char value, ByteOrder order)136*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_char(byte[] array, int index, char value, ByteOrder order) { 137*795d594fSAndroid Build Coastguard Worker setBytesAs_char(ByteBuffer.wrap(array), index, value, order); 138*795d594fSAndroid Build Coastguard Worker } 139*795d594fSAndroid Build Coastguard Worker setBytesAs_short(byte[] array, int index, short value, ByteOrder order)140*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_short(byte[] array, int index, short value, ByteOrder order) { 141*795d594fSAndroid Build Coastguard Worker setBytesAs_short(ByteBuffer.wrap(array), index, value, order); 142*795d594fSAndroid Build Coastguard Worker } 143*795d594fSAndroid Build Coastguard Worker setBytesAs_int(byte[] array, int index, int value, ByteOrder order)144*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_int(byte[] array, int index, int value, ByteOrder order) { 145*795d594fSAndroid Build Coastguard Worker setBytesAs_int(ByteBuffer.wrap(array), index, value, order); 146*795d594fSAndroid Build Coastguard Worker } 147*795d594fSAndroid Build Coastguard Worker setBytesAs_long(byte[] array, int index, long value, ByteOrder order)148*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_long(byte[] array, int index, long value, ByteOrder order) { 149*795d594fSAndroid Build Coastguard Worker setBytesAs_long(ByteBuffer.wrap(array), index, value, order); 150*795d594fSAndroid Build Coastguard Worker } 151*795d594fSAndroid Build Coastguard Worker setBytesAs_float(byte[] array, int index, float value, ByteOrder order)152*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_float(byte[] array, int index, float value, ByteOrder order) { 153*795d594fSAndroid Build Coastguard Worker setBytesAs_float(ByteBuffer.wrap(array), index, value, order); 154*795d594fSAndroid Build Coastguard Worker } 155*795d594fSAndroid Build Coastguard Worker setBytesAs_double(byte[] array, int index, double value, ByteOrder order)156*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_double(byte[] array, int index, double value, ByteOrder order) { 157*795d594fSAndroid Build Coastguard Worker setBytesAs_double(ByteBuffer.wrap(array), index, value, order); 158*795d594fSAndroid Build Coastguard Worker } 159*795d594fSAndroid Build Coastguard Worker setBytesAs_boolean( ByteBuffer buffer, int index, boolean value, ByteOrder order)160*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_boolean( 161*795d594fSAndroid Build Coastguard Worker ByteBuffer buffer, int index, boolean value, ByteOrder order) { 162*795d594fSAndroid Build Coastguard Worker buffer.order(order).put(index, value ? (byte) 1 : (byte) 0); 163*795d594fSAndroid Build Coastguard Worker } 164*795d594fSAndroid Build Coastguard Worker setBytesAs_byte(ByteBuffer buffer, int index, byte value, ByteOrder order)165*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_byte(ByteBuffer buffer, int index, byte value, ByteOrder order) { 166*795d594fSAndroid Build Coastguard Worker buffer.order(order).put(index, value); 167*795d594fSAndroid Build Coastguard Worker } 168*795d594fSAndroid Build Coastguard Worker setBytesAs_char(ByteBuffer buffer, int index, char value, ByteOrder order)169*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_char(ByteBuffer buffer, int index, char value, ByteOrder order) { 170*795d594fSAndroid Build Coastguard Worker buffer.order(order).putChar(index, value); 171*795d594fSAndroid Build Coastguard Worker } 172*795d594fSAndroid Build Coastguard Worker setBytesAs_short( ByteBuffer buffer, int index, short value, ByteOrder order)173*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_short( 174*795d594fSAndroid Build Coastguard Worker ByteBuffer buffer, int index, short value, ByteOrder order) { 175*795d594fSAndroid Build Coastguard Worker buffer.order(order).putShort(index, value); 176*795d594fSAndroid Build Coastguard Worker } 177*795d594fSAndroid Build Coastguard Worker setBytesAs_int(ByteBuffer buffer, int index, int value, ByteOrder order)178*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_int(ByteBuffer buffer, int index, int value, ByteOrder order) { 179*795d594fSAndroid Build Coastguard Worker buffer.order(order).putInt(index, value); 180*795d594fSAndroid Build Coastguard Worker } 181*795d594fSAndroid Build Coastguard Worker setBytesAs_long(ByteBuffer buffer, int index, long value, ByteOrder order)182*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_long(ByteBuffer buffer, int index, long value, ByteOrder order) { 183*795d594fSAndroid Build Coastguard Worker buffer.order(order).putLong(index, value); 184*795d594fSAndroid Build Coastguard Worker } 185*795d594fSAndroid Build Coastguard Worker setBytesAs_float( ByteBuffer buffer, int index, float value, ByteOrder order)186*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_float( 187*795d594fSAndroid Build Coastguard Worker ByteBuffer buffer, int index, float value, ByteOrder order) { 188*795d594fSAndroid Build Coastguard Worker buffer.order(order).putFloat(index, value); 189*795d594fSAndroid Build Coastguard Worker } 190*795d594fSAndroid Build Coastguard Worker setBytesAs_double( ByteBuffer buffer, int index, double value, ByteOrder order)191*795d594fSAndroid Build Coastguard Worker public static void setBytesAs_double( 192*795d594fSAndroid Build Coastguard Worker ByteBuffer buffer, int index, double value, ByteOrder order) { 193*795d594fSAndroid Build Coastguard Worker buffer.order(order).putDouble(index, value); 194*795d594fSAndroid Build Coastguard Worker } 195*795d594fSAndroid Build Coastguard Worker 196*795d594fSAndroid Build Coastguard Worker // Until ART is running on an OpenJDK9 based runtime, there are no 197*795d594fSAndroid Build Coastguard Worker // calls to help with alignment. OpenJDK9 introduces 198*795d594fSAndroid Build Coastguard Worker // ByteBuffer.alignedSlice() and ByteBuffer.alignmentOffset(). RI 199*795d594fSAndroid Build Coastguard Worker // and ART have different data structure alignments which may make 200*795d594fSAndroid Build Coastguard Worker // porting code interesting. 201*795d594fSAndroid Build Coastguard Worker alignedOffset_char(ByteBuffer buffer, int start)202*795d594fSAndroid Build Coastguard Worker public static int alignedOffset_char(ByteBuffer buffer, int start) { 203*795d594fSAndroid Build Coastguard Worker return alignedOffset_short(buffer, start); 204*795d594fSAndroid Build Coastguard Worker } 205*795d594fSAndroid Build Coastguard Worker alignedOffset_short(ByteBuffer buffer, int start)206*795d594fSAndroid Build Coastguard Worker public static int alignedOffset_short(ByteBuffer buffer, int start) { 207*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < Short.SIZE; ++i) { 208*795d594fSAndroid Build Coastguard Worker try { 209*795d594fSAndroid Build Coastguard Worker vh_probe_short.getVolatile(buffer, start + i); 210*795d594fSAndroid Build Coastguard Worker return start + i; 211*795d594fSAndroid Build Coastguard Worker } catch (IllegalStateException e) { 212*795d594fSAndroid Build Coastguard Worker // Unaligned access. 213*795d594fSAndroid Build Coastguard Worker } 214*795d594fSAndroid Build Coastguard Worker } 215*795d594fSAndroid Build Coastguard Worker return start; 216*795d594fSAndroid Build Coastguard Worker } 217*795d594fSAndroid Build Coastguard Worker alignedOffset_int(ByteBuffer buffer, int start)218*795d594fSAndroid Build Coastguard Worker public static int alignedOffset_int(ByteBuffer buffer, int start) { 219*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < Integer.SIZE; ++i) { 220*795d594fSAndroid Build Coastguard Worker try { 221*795d594fSAndroid Build Coastguard Worker vh_probe_int.getVolatile(buffer, start + i); 222*795d594fSAndroid Build Coastguard Worker return start + i; 223*795d594fSAndroid Build Coastguard Worker } catch (IllegalStateException e) { 224*795d594fSAndroid Build Coastguard Worker // Unaligned access. 225*795d594fSAndroid Build Coastguard Worker } catch (Exception e) { 226*795d594fSAndroid Build Coastguard Worker break; 227*795d594fSAndroid Build Coastguard Worker } 228*795d594fSAndroid Build Coastguard Worker } 229*795d594fSAndroid Build Coastguard Worker return start; 230*795d594fSAndroid Build Coastguard Worker } 231*795d594fSAndroid Build Coastguard Worker alignedOffset_long(ByteBuffer buffer, int start)232*795d594fSAndroid Build Coastguard Worker public static int alignedOffset_long(ByteBuffer buffer, int start) { 233*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < Long.SIZE; ++i) { 234*795d594fSAndroid Build Coastguard Worker try { 235*795d594fSAndroid Build Coastguard Worker vh_probe_long.getVolatile(buffer, start + i); 236*795d594fSAndroid Build Coastguard Worker return start + i; 237*795d594fSAndroid Build Coastguard Worker } catch (IllegalStateException e) { 238*795d594fSAndroid Build Coastguard Worker // Unaligned access. 239*795d594fSAndroid Build Coastguard Worker } catch (UnsupportedOperationException e) { 240*795d594fSAndroid Build Coastguard Worker // 64-bit operation is not supported irrespective of alignment. 241*795d594fSAndroid Build Coastguard Worker break; 242*795d594fSAndroid Build Coastguard Worker } 243*795d594fSAndroid Build Coastguard Worker } 244*795d594fSAndroid Build Coastguard Worker return start; 245*795d594fSAndroid Build Coastguard Worker } 246*795d594fSAndroid Build Coastguard Worker alignedOffset_float(ByteBuffer buffer, int start)247*795d594fSAndroid Build Coastguard Worker public static int alignedOffset_float(ByteBuffer buffer, int start) { 248*795d594fSAndroid Build Coastguard Worker return alignedOffset_int(buffer, start); 249*795d594fSAndroid Build Coastguard Worker } 250*795d594fSAndroid Build Coastguard Worker alignedOffset_double(ByteBuffer buffer, int start)251*795d594fSAndroid Build Coastguard Worker public static int alignedOffset_double(ByteBuffer buffer, int start) { 252*795d594fSAndroid Build Coastguard Worker return alignedOffset_long(buffer, start); 253*795d594fSAndroid Build Coastguard Worker } 254*795d594fSAndroid Build Coastguard Worker alignedOffset_char(byte[] array, int start)255*795d594fSAndroid Build Coastguard Worker public static int alignedOffset_char(byte[] array, int start) { 256*795d594fSAndroid Build Coastguard Worker return alignedOffset_char(ByteBuffer.wrap(array), start); 257*795d594fSAndroid Build Coastguard Worker } 258*795d594fSAndroid Build Coastguard Worker alignedOffset_short(byte[] array, int start)259*795d594fSAndroid Build Coastguard Worker public static int alignedOffset_short(byte[] array, int start) { 260*795d594fSAndroid Build Coastguard Worker return alignedOffset_short(ByteBuffer.wrap(array), start); 261*795d594fSAndroid Build Coastguard Worker } 262*795d594fSAndroid Build Coastguard Worker alignedOffset_int(byte[] array, int start)263*795d594fSAndroid Build Coastguard Worker public static int alignedOffset_int(byte[] array, int start) { 264*795d594fSAndroid Build Coastguard Worker return alignedOffset_int(ByteBuffer.wrap(array), start); 265*795d594fSAndroid Build Coastguard Worker } 266*795d594fSAndroid Build Coastguard Worker alignedOffset_long(byte[] array, int start)267*795d594fSAndroid Build Coastguard Worker public static int alignedOffset_long(byte[] array, int start) { 268*795d594fSAndroid Build Coastguard Worker return alignedOffset_long(ByteBuffer.wrap(array), start); 269*795d594fSAndroid Build Coastguard Worker } 270*795d594fSAndroid Build Coastguard Worker alignedOffset_float(byte[] array, int start)271*795d594fSAndroid Build Coastguard Worker public static int alignedOffset_float(byte[] array, int start) { 272*795d594fSAndroid Build Coastguard Worker return alignedOffset_float(ByteBuffer.wrap(array), start); 273*795d594fSAndroid Build Coastguard Worker } 274*795d594fSAndroid Build Coastguard Worker alignedOffset_double(byte[] array, int start)275*795d594fSAndroid Build Coastguard Worker public static int alignedOffset_double(byte[] array, int start) { 276*795d594fSAndroid Build Coastguard Worker return alignedOffset_double(ByteBuffer.wrap(array), start); 277*795d594fSAndroid Build Coastguard Worker } 278*795d594fSAndroid Build Coastguard Worker 279*795d594fSAndroid Build Coastguard Worker static { 280*795d594fSAndroid Build Coastguard Worker ByteOrder order = ByteOrder.LITTLE_ENDIAN; 281*795d594fSAndroid Build Coastguard Worker vh_probe_short = MethodHandles.byteBufferViewVarHandle(short[].class, order); 282*795d594fSAndroid Build Coastguard Worker vh_probe_int = MethodHandles.byteBufferViewVarHandle(int[].class, order); 283*795d594fSAndroid Build Coastguard Worker vh_probe_long = MethodHandles.byteBufferViewVarHandle(long[].class, order); 284*795d594fSAndroid Build Coastguard Worker } 285*795d594fSAndroid Build Coastguard Worker 286*795d594fSAndroid Build Coastguard Worker private static final VarHandle vh_probe_short; 287*795d594fSAndroid Build Coastguard Worker private static final VarHandle vh_probe_int; 288*795d594fSAndroid Build Coastguard Worker private static final VarHandle vh_probe_long; 289*795d594fSAndroid Build Coastguard Worker } 290