1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1665a54dc66d2c7b6e16fc24a6ce66e50483620745Andy McFadden 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Inlined native functions. 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_INLINENATIVE_H_ 21375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_INLINENATIVE_H_ 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* startup/shutdown */ 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmInlineNativeStartup(void); 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmInlineNativeShutdown(void); 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 27fe700260881c8f59ee2f2dc2308aef3b0cc39734Elliott HughesMethod* dvmFindInlinableMethod(const char* classDescriptor, 28fe700260881c8f59ee2f2dc2308aef3b0cc39734Elliott Hughes const char* methodName, const char* methodSignature); 29fe700260881c8f59ee2f2dc2308aef3b0cc39734Elliott Hughes 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Basic 4-argument inline operation handler. 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef bool (*InlineOp4Func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult); 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Table of inline operations. 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Try to keep this at a power-of-two size, so we don't have to multiply. 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: might be to our advantage to generate a compact jump table on 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the heap at runtime (or just declare two static tables, one with full 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * info and one with just function pointers). Especially useful if we decide 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to support other method call forms, e.g. /range. We can also just 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * generate assembly code that knows how many args it needs and has the 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * target address embedded. 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 48d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct InlineOperation { 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InlineOp4Func func; /* MUST be first entry */ 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* classDescriptor; 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* methodName; 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* methodSignature; 53d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5569ee8f605ad4139c8b9a39821fd7a4cadb9d9337Elliott Hughes/* 566986bcfd1cdeafb594203fee605ebed456fe83c3Elliott Hughes * Must be kept in sync w/ gDvmInlineOpsTable in InlineNative.cpp 5769ee8f605ad4139c8b9a39821fd7a4cadb9d9337Elliott Hughes * 5869ee8f605ad4139c8b9a39821fd7a4cadb9d9337Elliott Hughes * You should also add a test to libcore's IntrinsicTest. 5969ee8f605ad4139c8b9a39821fd7a4cadb9d9337Elliott Hughes */ 60d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroenum NativeInlineOps { 6150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee INLINE_EMPTYINLINEMETHOD = 0, 6250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee INLINE_STRING_CHARAT = 1, 6350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee INLINE_STRING_COMPARETO = 2, 6450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee INLINE_STRING_EQUALS = 3, 652bdbcb6db8c3ab984cf64d4a3a3f0d5529aa9e52Elliott Hughes INLINE_STRING_FASTINDEXOF_II = 4, 662bdbcb6db8c3ab984cf64d4a3a3f0d5529aa9e52Elliott Hughes INLINE_STRING_IS_EMPTY = 5, 672bdbcb6db8c3ab984cf64d4a3a3f0d5529aa9e52Elliott Hughes INLINE_STRING_LENGTH = 6, 682bdbcb6db8c3ab984cf64d4a3a3f0d5529aa9e52Elliott Hughes INLINE_MATH_ABS_INT = 7, 692bdbcb6db8c3ab984cf64d4a3a3f0d5529aa9e52Elliott Hughes INLINE_MATH_ABS_LONG = 8, 702bdbcb6db8c3ab984cf64d4a3a3f0d5529aa9e52Elliott Hughes INLINE_MATH_ABS_FLOAT = 9, 712bdbcb6db8c3ab984cf64d4a3a3f0d5529aa9e52Elliott Hughes INLINE_MATH_ABS_DOUBLE = 10, 722bdbcb6db8c3ab984cf64d4a3a3f0d5529aa9e52Elliott Hughes INLINE_MATH_MIN_INT = 11, 732bdbcb6db8c3ab984cf64d4a3a3f0d5529aa9e52Elliott Hughes INLINE_MATH_MAX_INT = 12, 742bdbcb6db8c3ab984cf64d4a3a3f0d5529aa9e52Elliott Hughes INLINE_MATH_SQRT = 13, 752bdbcb6db8c3ab984cf64d4a3a3f0d5529aa9e52Elliott Hughes INLINE_MATH_COS = 14, 762bdbcb6db8c3ab984cf64d4a3a3f0d5529aa9e52Elliott Hughes INLINE_MATH_SIN = 15, 77e22bd84c8c8a57ddd86c21a1f65137d549b07935Elliott Hughes INLINE_FLOAT_TO_INT_BITS = 16, 78e22bd84c8c8a57ddd86c21a1f65137d549b07935Elliott Hughes INLINE_FLOAT_TO_RAW_INT_BITS = 17, 79e22bd84c8c8a57ddd86c21a1f65137d549b07935Elliott Hughes INLINE_INT_BITS_TO_FLOAT = 18, 80e22bd84c8c8a57ddd86c21a1f65137d549b07935Elliott Hughes INLINE_DOUBLE_TO_LONG_BITS = 19, 81e22bd84c8c8a57ddd86c21a1f65137d549b07935Elliott Hughes INLINE_DOUBLE_TO_RAW_LONG_BITS = 20, 82e22bd84c8c8a57ddd86c21a1f65137d549b07935Elliott Hughes INLINE_LONG_BITS_TO_DOUBLE = 21, 836986bcfd1cdeafb594203fee605ebed456fe83c3Elliott Hughes INLINE_STRICT_MATH_ABS_INT = 22, 846986bcfd1cdeafb594203fee605ebed456fe83c3Elliott Hughes INLINE_STRICT_MATH_ABS_LONG = 23, 856986bcfd1cdeafb594203fee605ebed456fe83c3Elliott Hughes INLINE_STRICT_MATH_ABS_FLOAT = 24, 866986bcfd1cdeafb594203fee605ebed456fe83c3Elliott Hughes INLINE_STRICT_MATH_ABS_DOUBLE = 25, 876986bcfd1cdeafb594203fee605ebed456fe83c3Elliott Hughes INLINE_STRICT_MATH_MIN_INT = 26, 886986bcfd1cdeafb594203fee605ebed456fe83c3Elliott Hughes INLINE_STRICT_MATH_MAX_INT = 27, 896986bcfd1cdeafb594203fee605ebed456fe83c3Elliott Hughes INLINE_STRICT_MATH_SQRT = 28, 90d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 9150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the inlineops table. 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst InlineOperation* dvmGetInlineOpsTable(void); 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dvmGetInlineOpsTableLength(void); 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The table, exposed so we can access it with C inlines. Prefer access 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * through dvmGetInlineOpsTable(). 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectextern const InlineOperation gDvmInlineOpsTable[]; 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Perform the operation specified by "opIndex". 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We want the arguments to appear in the first 4 registers so they can 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be passed straight through to the handler function. Ideally on ARM 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * they'll go into r0-r3 and stay there. 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns "true" if everything went normally, "false" if an exception 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * was thrown. 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE bool dvmPerformInlineOp4Std(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult, int opIndex) 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (*gDvmInlineOpsTable[opIndex].func)(arg0, arg1, arg2, arg3, pResult); 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Like the "std" version, but will emit profiling info. 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmPerformInlineOp4Dbg(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult, int opIndex); 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1269a3147c7412f4794434b4c2604aa2ba784867774buzbee/* 1279a3147c7412f4794434b4c2604aa2ba784867774buzbee * Return method & populate the table on first use. 1289a3147c7412f4794434b4c2604aa2ba784867774buzbee */ 129d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" Method* dvmResolveInlineNative(int opIndex); 1309a3147c7412f4794434b4c2604aa2ba784867774buzbee 131db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro/* 132db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro * The actual inline native definitions. 133db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro */ 134db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangString_charAt(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 135db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 136db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 137db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangString_compareTo(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 138db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 139db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 140db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangString_equals(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 141db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 142db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 143db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangString_length(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 144db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 145db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 146db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangString_isEmpty(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 147db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 148db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 149db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangString_fastIndexOf_II(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 150db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 151db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 152db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangMath_abs_int(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 153db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 154db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 155db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangMath_abs_long(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 156db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 157db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 158db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangMath_abs_float(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 159db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 160db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 161db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangMath_abs_double(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 162db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 163db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 164db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangMath_min_int(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 165db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 166db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 167db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangMath_max_int(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 168db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 169db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 170db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangMath_sqrt(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 171db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 172db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 173db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangMath_cos(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 174db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 175db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 176db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangMath_sin(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 177db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 178db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 179db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangFloat_floatToIntBits(u4 arg0, u4 arg1, u4 arg2, u4 arg, 180db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 181db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 182db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangFloat_floatToRawIntBits(u4 arg0, u4 arg1, u4 arg2, u4 arg, 183db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 184db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 185db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangFloat_intBitsToFloat(u4 arg0, u4 arg1, u4 arg2, u4 arg, 186db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 187db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 188db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangDouble_doubleToLongBits(u4 arg0, u4 arg1, u4 arg2, u4 arg, 189db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 190db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 191db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangDouble_longBitsToDouble(u4 arg0, u4 arg1, u4 arg2, u4 arg, 192db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 193db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 194db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangDouble_doubleToRawLongBits(u4 arg0, u4 arg1, u4 arg2, 195db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro u4 arg, JValue* pResult); 196db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 197db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapirobool javaLangDouble_longBitsToDouble(u4 arg0, u4 arg1, u4 arg2, u4 arg, 198db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro JValue* pResult); 199db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro 200375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif // DALVIK_INLINENATIVE_H_ 201