1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 import java.lang.reflect.Method; 18 19 public class Main { main(String[] args)20 public static void main(String[] args) { 21 System.loadLibrary("arttest"); 22 testFindClassOnAttachedNativeThread(); 23 testFindFieldOnAttachedNativeThread(); 24 testReflectFieldGetFromAttachedNativeThreadNative(); 25 testCallStaticVoidMethodOnSubClass(); 26 testGetMirandaMethod(); 27 testZeroLengthByteBuffers(); 28 testByteMethod(); 29 testShortMethod(); 30 testBooleanMethod(); 31 testCharMethod(); 32 testIsAssignableFromOnPrimitiveTypes(); 33 testShallowGetCallingClassLoader(); 34 testShallowGetStackClass2(); 35 } 36 testFindClassOnAttachedNativeThread()37 private static native void testFindClassOnAttachedNativeThread(); 38 39 private static boolean testFindFieldOnAttachedNativeThreadField; 40 testReflectFieldGetFromAttachedNativeThreadNative()41 private static native void testReflectFieldGetFromAttachedNativeThreadNative(); 42 43 public static boolean testReflectFieldGetFromAttachedNativeThreadField; 44 testFindFieldOnAttachedNativeThread()45 private static void testFindFieldOnAttachedNativeThread() { 46 testFindFieldOnAttachedNativeThreadNative(); 47 if (!testFindFieldOnAttachedNativeThreadField) { 48 throw new AssertionError(); 49 } 50 } 51 testFindFieldOnAttachedNativeThreadNative()52 private static native void testFindFieldOnAttachedNativeThreadNative(); 53 testCallStaticVoidMethodOnSubClass()54 private static void testCallStaticVoidMethodOnSubClass() { 55 testCallStaticVoidMethodOnSubClassNative(); 56 if (!testCallStaticVoidMethodOnSubClass_SuperClass.executed) { 57 throw new AssertionError(); 58 } 59 } 60 testCallStaticVoidMethodOnSubClassNative()61 private static native void testCallStaticVoidMethodOnSubClassNative(); 62 63 private static class testCallStaticVoidMethodOnSubClass_SuperClass { 64 private static boolean executed = false; execute()65 private static void execute() { 66 executed = true; 67 } 68 } 69 70 private static class testCallStaticVoidMethodOnSubClass_SubClass 71 extends testCallStaticVoidMethodOnSubClass_SuperClass { 72 } 73 testGetMirandaMethodNative()74 private static native Method testGetMirandaMethodNative(); 75 testGetMirandaMethod()76 private static void testGetMirandaMethod() { 77 Method m = testGetMirandaMethodNative(); 78 if (m.getDeclaringClass() != testGetMirandaMethod_MirandaInterface.class) { 79 throw new AssertionError(); 80 } 81 } 82 testZeroLengthByteBuffers()83 private static native void testZeroLengthByteBuffers(); 84 85 private static abstract class testGetMirandaMethod_MirandaAbstract implements testGetMirandaMethod_MirandaInterface { inAbstract()86 public boolean inAbstract() { 87 return true; 88 } 89 } 90 91 private static interface testGetMirandaMethod_MirandaInterface { inInterface()92 public boolean inInterface(); 93 } 94 95 // Test sign-extension for values < 32b 96 byteMethod(byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7, byte b8, byte b9, byte b10)97 native static byte byteMethod(byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7, 98 byte b8, byte b9, byte b10); 99 testByteMethod()100 private static void testByteMethod() { 101 byte returns[] = { 0, 1, 2, 127, -1, -2, -128 }; 102 for (int i = 0; i < returns.length; i++) { 103 byte result = byteMethod((byte)i, (byte)2, (byte)(-3), (byte)4, (byte)(-5), (byte)6, 104 (byte)(-7), (byte)8, (byte)(-9), (byte)10); 105 if (returns[i] != result) { 106 System.out.println("Run " + i + " with " + returns[i] + " vs " + result); 107 throw new AssertionError(); 108 } 109 } 110 } 111 shortMethod(short s1, short s2, short s3, short s4, short s5, short s6, short s7, short s8, short s9, short s10)112 native static short shortMethod(short s1, short s2, short s3, short s4, short s5, short s6, short s7, 113 short s8, short s9, short s10); 114 testShortMethod()115 private static void testShortMethod() { 116 short returns[] = { 0, 1, 2, 127, 32767, -1, -2, -128, -32768 }; 117 for (int i = 0; i < returns.length; i++) { 118 short result = shortMethod((short)i, (short)2, (short)(-3), (short)4, (short)(-5), (short)6, 119 (short)(-7), (short)8, (short)(-9), (short)10); 120 if (returns[i] != result) { 121 System.out.println("Run " + i + " with " + returns[i] + " vs " + result); 122 throw new AssertionError(); 123 } 124 } 125 } 126 127 // Test zero-extension for values < 32b 128 booleanMethod(boolean b1, boolean b2, boolean b3, boolean b4, boolean b5, boolean b6, boolean b7, boolean b8, boolean b9, boolean b10)129 native static boolean booleanMethod(boolean b1, boolean b2, boolean b3, boolean b4, boolean b5, boolean b6, boolean b7, 130 boolean b8, boolean b9, boolean b10); 131 testBooleanMethod()132 private static void testBooleanMethod() { 133 if (booleanMethod(false, true, false, true, false, true, false, true, false, true)) { 134 throw new AssertionError(); 135 } 136 137 if (!booleanMethod(true, true, false, true, false, true, false, true, false, true)) { 138 throw new AssertionError(); 139 } 140 } 141 charMethod(char c1, char c2, char c3, char c4, char c5, char c6, char c7, char c8, char c9, char c10)142 native static char charMethod(char c1, char c2, char c3, char c4, char c5, char c6, char c7, 143 char c8, char c9, char c10); 144 testCharMethod()145 private static void testCharMethod() { 146 char returns[] = { (char)0, (char)1, (char)2, (char)127, (char)255, (char)256, (char)15000, 147 (char)34000 }; 148 for (int i = 0; i < returns.length; i++) { 149 char result = charMethod((char)i, 'a', 'b', 'c', '0', '1', '2', (char)1234, (char)2345, 150 (char)3456); 151 if (returns[i] != result) { 152 System.out.println("Run " + i + " with " + (int)returns[i] + " vs " + (int)result); 153 throw new AssertionError(); 154 } 155 } 156 } 157 158 // http://b/16531674 testIsAssignableFromOnPrimitiveTypes()159 private static void testIsAssignableFromOnPrimitiveTypes() { 160 if (!nativeIsAssignableFrom(int.class, Integer.TYPE)) { 161 System.out.println("IsAssignableFrom(int.class, Integer.TYPE) returned false, expected true"); 162 throw new AssertionError(); 163 } 164 165 if (!nativeIsAssignableFrom(Integer.TYPE, int.class)) { 166 System.out.println("IsAssignableFrom(Integer.TYPE, int.class) returned false, expected true"); 167 throw new AssertionError(); 168 } 169 } 170 nativeIsAssignableFrom(Class<?> from, Class<?> to)171 native static boolean nativeIsAssignableFrom(Class<?> from, Class<?> to); 172 testShallowGetCallingClassLoader()173 static void testShallowGetCallingClassLoader() { 174 nativeTestShallowGetCallingClassLoader(); 175 } 176 nativeTestShallowGetCallingClassLoader()177 native static void nativeTestShallowGetCallingClassLoader(); 178 testShallowGetStackClass2()179 static void testShallowGetStackClass2() { 180 nativeTestShallowGetStackClass2(); 181 } 182 nativeTestShallowGetStackClass2()183 native static void nativeTestShallowGetStackClass2(); 184 } 185