1ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom/* 2ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * Copyright (C) 2013 The Android Open Source Project 3ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * 4ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 5ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * you may not use this file except in compliance with the License. 6ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * You may obtain a copy of the License at 7ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * 8ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 9ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * 10ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * Unless required by applicable law or agreed to in writing, software 11ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 12ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * See the License for the specific language governing permissions and 14ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom * limitations under the License. 15ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom */ 16ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom 17201803fb1acd15b9daae51d816e1b08aededdc41Jeff Haoimport java.lang.reflect.Method; 18201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao 191c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampepublic class Main { 20ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom public static void main(String[] args) { 21ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom System.loadLibrary("arttest"); 22ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom testFindClassOnAttachedNativeThread(); 2362509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao testFindFieldOnAttachedNativeThread(); 243bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko testReflectFieldGetFromAttachedNativeThreadNative(); 2567fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom testCallStaticVoidMethodOnSubClass(); 26201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao testGetMirandaMethod(); 27ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath testZeroLengthByteBuffers(); 28d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe testByteMethod(); 29d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe testShortMethod(); 30d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe testBooleanMethod(); 31d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe testCharMethod(); 321268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath testIsAssignableFromOnPrimitiveTypes(); 3361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe testShallowGetCallingClassLoader(); 34ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe testShallowGetStackClass2(); 35ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom } 36ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom 37ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom private static native void testFindClassOnAttachedNativeThread(); 3867fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom 3962509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao private static boolean testFindFieldOnAttachedNativeThreadField; 4062509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao 413bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko private static native void testReflectFieldGetFromAttachedNativeThreadNative(); 423bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko 433bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko public static boolean testReflectFieldGetFromAttachedNativeThreadField; 443bd7a6c1716935e758f230e2f199128cb3c28b42Vladimir Marko 4562509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao private static void testFindFieldOnAttachedNativeThread() { 4662509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao testFindFieldOnAttachedNativeThreadNative(); 4762509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao if (!testFindFieldOnAttachedNativeThreadField) { 4862509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao throw new AssertionError(); 4962509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao } 5062509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao } 5162509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao 5262509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao private static native void testFindFieldOnAttachedNativeThreadNative(); 5362509b662929175228bb0d0f014ef4ef4e33be10Jeff Hao 5467fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom private static void testCallStaticVoidMethodOnSubClass() { 5567fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom testCallStaticVoidMethodOnSubClassNative(); 5667fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom if (!testCallStaticVoidMethodOnSubClass_SuperClass.executed) { 5767fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom throw new AssertionError(); 5867fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom } 5967fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom } 6067fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom 6167fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom private static native void testCallStaticVoidMethodOnSubClassNative(); 6267fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom 6367fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom private static class testCallStaticVoidMethodOnSubClass_SuperClass { 6467fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom private static boolean executed = false; 6567fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom private static void execute() { 6667fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom executed = true; 6767fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom } 6867fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom } 6967fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom 7067fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom private static class testCallStaticVoidMethodOnSubClass_SubClass 7167fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom extends testCallStaticVoidMethodOnSubClass_SuperClass { 7267fe2b41a6afccf6ab1a58879eae3e0e8f3d6c7aBrian Carlstrom } 73201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao 74201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao private static native Method testGetMirandaMethodNative(); 75201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao 76201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao private static void testGetMirandaMethod() { 77201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao Method m = testGetMirandaMethodNative(); 78201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao if (m.getDeclaringClass() != testGetMirandaMethod_MirandaInterface.class) { 79201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao throw new AssertionError(); 80201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao } 81201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao } 82201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao 83ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath private static native void testZeroLengthByteBuffers(); 84ef809d09cf0d28d999ac69969e4506d8afa4624dNarayan Kamath 85201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao private static abstract class testGetMirandaMethod_MirandaAbstract implements testGetMirandaMethod_MirandaInterface { 86201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao public boolean inAbstract() { 87201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao return true; 88201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao } 89201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao } 90201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao 91201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao private static interface testGetMirandaMethod_MirandaInterface { 92201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao public boolean inInterface(); 93201803fb1acd15b9daae51d816e1b08aededdc41Jeff Hao } 94d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe 95d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe // Test sign-extension for values < 32b 96d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe 97d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe native static byte byteMethod(byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7, 98d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe byte b8, byte b9, byte b10); 99d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe 100d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe private static void testByteMethod() { 101d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe byte returns[] = { 0, 1, 2, 127, -1, -2, -128 }; 102d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe for (int i = 0; i < returns.length; i++) { 103d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe byte result = byteMethod((byte)i, (byte)2, (byte)(-3), (byte)4, (byte)(-5), (byte)6, 104d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe (byte)(-7), (byte)8, (byte)(-9), (byte)10); 105d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe if (returns[i] != result) { 106d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe System.out.println("Run " + i + " with " + returns[i] + " vs " + result); 107d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe throw new AssertionError(); 108d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 109d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 110d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 111d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe 112d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe native static short shortMethod(short s1, short s2, short s3, short s4, short s5, short s6, short s7, 113d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe short s8, short s9, short s10); 114d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe 115d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe private static void testShortMethod() { 116d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe short returns[] = { 0, 1, 2, 127, 32767, -1, -2, -128, -32768 }; 117d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe for (int i = 0; i < returns.length; i++) { 118d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe short result = shortMethod((short)i, (short)2, (short)(-3), (short)4, (short)(-5), (short)6, 119d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe (short)(-7), (short)8, (short)(-9), (short)10); 120d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe if (returns[i] != result) { 121d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe System.out.println("Run " + i + " with " + returns[i] + " vs " + result); 122d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe throw new AssertionError(); 123d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 124d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 125d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 126d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe 127d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe // Test zero-extension for values < 32b 128d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe 129d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe native static boolean booleanMethod(boolean b1, boolean b2, boolean b3, boolean b4, boolean b5, boolean b6, boolean b7, 130d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe boolean b8, boolean b9, boolean b10); 131d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe 132d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe private static void testBooleanMethod() { 133d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe if (booleanMethod(false, true, false, true, false, true, false, true, false, true)) { 134d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe throw new AssertionError(); 135d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 136d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe 137d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe if (!booleanMethod(true, true, false, true, false, true, false, true, false, true)) { 138d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe throw new AssertionError(); 139d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 140d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 141d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe 142d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe native static char charMethod(char c1, char c2, char c3, char c4, char c5, char c6, char c7, 143d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe char c8, char c9, char c10); 144d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe 145d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe private static void testCharMethod() { 146d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe char returns[] = { (char)0, (char)1, (char)2, (char)127, (char)255, (char)256, (char)15000, 147d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe (char)34000 }; 148d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe for (int i = 0; i < returns.length; i++) { 149d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe char result = charMethod((char)i, 'a', 'b', 'c', '0', '1', '2', (char)1234, (char)2345, 150d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe (char)3456); 151d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe if (returns[i] != result) { 152d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe System.out.println("Run " + i + " with " + (int)returns[i] + " vs " + (int)result); 153d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe throw new AssertionError(); 154d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 155d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 156d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 1571268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath 1581268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath // http://b/16531674 1591268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath private static void testIsAssignableFromOnPrimitiveTypes() { 1601268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath if (!nativeIsAssignableFrom(int.class, Integer.TYPE)) { 1611268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath System.out.println("IsAssignableFrom(int.class, Integer.TYPE) returned false, expected true"); 1621268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath throw new AssertionError(); 1631268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath } 1641268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath 1651268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath if (!nativeIsAssignableFrom(Integer.TYPE, int.class)) { 1661268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath System.out.println("IsAssignableFrom(Integer.TYPE, int.class) returned false, expected true"); 1671268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath throw new AssertionError(); 1681268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath } 1691268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath } 1701268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath 1711268b742c8cff7318dc0b5b283cbaeabfe0725baNarayan Kamath native static boolean nativeIsAssignableFrom(Class<?> from, Class<?> to); 17261bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe 17361bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe static void testShallowGetCallingClassLoader() { 17461bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe nativeTestShallowGetCallingClassLoader(); 17561bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe } 17661bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe 17761bf6a1c80bf797af5d7911ff71fc367fdb36742Andreas Gampe native static void nativeTestShallowGetCallingClassLoader(); 178ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe 179ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe static void testShallowGetStackClass2() { 180ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe nativeTestShallowGetStackClass2(); 181ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe } 182ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe 183ab61295e55c38072095e498053b8f5bebf46ad63Andreas Gampe native static void nativeTestShallowGetStackClass2(); 184ce88853ab316c70ef7b598978a3609611db60552Brian Carlstrom} 185