1/* 2 * Copyright (C) 2014 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 17import java.lang.reflect.Method; 18import java.lang.System; 19 20// This is named Main as it is a copy of JniTest, so that we can re-use the native implementations 21// from libarttest. 22class Main { 23 public static void main(String[] args) { 24 testFindClassOnAttachedNativeThread(); 25 testFindFieldOnAttachedNativeThread(); 26 testCallStaticVoidMethodOnSubClass(); 27 testGetMirandaMethod(); 28 testZeroLengthByteBuffers(); 29 testByteMethod(); 30 testShortMethod(); 31 testBooleanMethod(); 32 testCharMethod(); 33 testEnvironment(); 34 testNewStringObject(); 35 testSignalHandler(); 36 } 37 38 public static native void testFindClassOnAttachedNativeThread(); 39 40 public static boolean testFindFieldOnAttachedNativeThreadField; 41 42 public static void testFindFieldOnAttachedNativeThread() { 43 testFindFieldOnAttachedNativeThreadNative(); 44 if (!testFindFieldOnAttachedNativeThreadField) { 45 throw new AssertionError(); 46 } 47 } 48 49 private static native void testFindFieldOnAttachedNativeThreadNative(); 50 51 private static void testCallStaticVoidMethodOnSubClass() { 52 testCallStaticVoidMethodOnSubClassNative(); 53 if (!testCallStaticVoidMethodOnSubClass_SuperClass.executed) { 54 throw new AssertionError(); 55 } 56 } 57 58 private static native void testCallStaticVoidMethodOnSubClassNative(); 59 60 private static class testCallStaticVoidMethodOnSubClass_SuperClass { 61 private static boolean executed = false; 62 private static void execute() { 63 executed = true; 64 } 65 } 66 67 private static class testCallStaticVoidMethodOnSubClass_SubClass 68 extends testCallStaticVoidMethodOnSubClass_SuperClass { 69 } 70 71 private static native Method testGetMirandaMethodNative(); 72 73 private static void testGetMirandaMethod() { 74 Method m = testGetMirandaMethodNative(); 75 if (m.getDeclaringClass() != testGetMirandaMethod_MirandaInterface.class) { 76 throw new AssertionError(); 77 } 78 } 79 80 private static native void testZeroLengthByteBuffers(); 81 82 private static abstract class testGetMirandaMethod_MirandaAbstract implements testGetMirandaMethod_MirandaInterface { 83 public boolean inAbstract() { 84 return true; 85 } 86 } 87 88 private static interface testGetMirandaMethod_MirandaInterface { 89 public boolean inInterface(); 90 } 91 92 // Test sign-extension for values < 32b 93 94 native static byte byteMethod(byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7, 95 byte b8, byte b9, byte b10); 96 97 public static void testByteMethod() { 98 byte returns[] = { 0, 1, 2, 127, -1, -2, -128 }; 99 for (int i = 0; i < returns.length; i++) { 100 byte result = byteMethod((byte)i, (byte)2, (byte)(-3), (byte)4, (byte)(-5), (byte)6, 101 (byte)(-7), (byte)8, (byte)(-9), (byte)10); 102 if (returns[i] != result) { 103 System.out.println("Run " + i + " with " + returns[i] + " vs " + result); 104 throw new AssertionError(); 105 } 106 } 107 } 108 109 native static short shortMethod(short s1, short s2, short s3, short s4, short s5, short s6, short s7, 110 short s8, short s9, short s10); 111 112 private static void testShortMethod() { 113 short returns[] = { 0, 1, 2, 127, 32767, -1, -2, -128, -32768 }; 114 for (int i = 0; i < returns.length; i++) { 115 short result = shortMethod((short)i, (short)2, (short)(-3), (short)4, (short)(-5), (short)6, 116 (short)(-7), (short)8, (short)(-9), (short)10); 117 if (returns[i] != result) { 118 System.out.println("Run " + i + " with " + returns[i] + " vs " + result); 119 throw new AssertionError(); 120 } 121 } 122 } 123 124 // Test zero-extension for values < 32b 125 126 native static boolean booleanMethod(boolean b1, boolean b2, boolean b3, boolean b4, boolean b5, boolean b6, boolean b7, 127 boolean b8, boolean b9, boolean b10); 128 129 public static void testBooleanMethod() { 130 if (booleanMethod(false, true, false, true, false, true, false, true, false, true)) { 131 throw new AssertionError(); 132 } 133 134 if (!booleanMethod(true, true, false, true, false, true, false, true, false, true)) { 135 throw new AssertionError(); 136 } 137 } 138 139 native static char charMethod(char c1, char c2, char c3, char c4, char c5, char c6, char c7, 140 char c8, char c9, char c10); 141 142 private static void testCharMethod() { 143 char returns[] = { (char)0, (char)1, (char)2, (char)127, (char)255, (char)256, (char)15000, 144 (char)34000 }; 145 for (int i = 0; i < returns.length; i++) { 146 char result = charMethod((char)i, 'a', 'b', 'c', '0', '1', '2', (char)1234, (char)2345, 147 (char)3456); 148 if (returns[i] != result) { 149 System.out.println("Run " + i + " with " + (int)returns[i] + " vs " + (int)result); 150 throw new AssertionError(); 151 } 152 } 153 } 154 155 private static void testEnvironment() { 156 String osArch = System.getProperty("os.arch"); 157 if (!"os.arch".equals(osArch)) { 158 throw new AssertionError("unexpected value for os.arch: " + osArch); 159 } 160 // TODO: improve the build script to get these running as well. 161 // if (!"cpu_abi".equals(Build.CPU_ABI)) { 162 // throw new AssertionError("unexpected value for cpu_abi"); 163 // } 164 // if (!"cpu_abi2".equals(Build.CPU_ABI2)) { 165 // throw new AssertionError("unexpected value for cpu_abi2"); 166 // } 167 // String[] expectedSupportedAbis = {"supported1", "supported2", "supported3"}; 168 // if (Arrays.equals(expectedSupportedAbis, Build.SUPPORTED_ABIS)) { 169 // throw new AssertionError("unexpected value for supported_abis"); 170 // } 171 } 172 173 private static native void testNewStringObject(); 174 175 // Test v2 special signal handlers. This uses the native code from 004-SignalTest to cause 176 // a non-managed segfault. 177 private static void testSignalHandler() { 178 // This uses code from 004-SignalTest. 179 int x = testSignal(); 180 if (x != 1234) { 181 throw new AssertionError(); 182 } 183 } 184 185 private static native int testSignal(); 186} 187 188public class NativeBridgeMain { 189 static public void main(String[] args) throws Exception { 190 System.out.println("Ready for native bridge tests."); 191 192 System.loadLibrary(args[0]); 193 194 Main.main(null); 195 } 196} 197