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 */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * java.lang.Class 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "Dalvik.h" 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "native/InternalNativePriv.h" 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * native public boolean desiredAssertionStatus() 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determine the class-init-time assertion status of a class. This is 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * called from <clinit> in javac-generated classes that use the Java 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * programming language "assert" keyword. 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_desiredAssertionStatus(const u4* args, 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* thisPtr = (ClassObject*) args[0]; 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project char* className = dvmDescriptorToName(thisPtr->descriptor); 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int i; 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool enable = false; 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Run through the list of arguments specified on the command line. The 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last matching argument takes precedence. 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (i = 0; i < gDvm.assertionCtrlCount; i++) { 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const AssertionControl* pCtrl = &gDvm.assertionCtrl[i]; 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pCtrl->isPackage) { 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Given "dalvik/system/Debug" or "MyStuff", compute the 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * length of the package portion of the class name string. 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unlike most package operations, we allow matching on 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "sub-packages", so "dalvik..." will match "dalvik.Foo" 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and "dalvik.system.Foo". 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The pkgOrClass string looks like "dalvik/system/", i.e. it still 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * has the terminating slash, so we can be sure we're comparing 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * against full package component names. 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* lastSlash; 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int pkgLen; 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project lastSlash = strrchr(className, '/'); 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (lastSlash == NULL) { 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pkgLen = 0; 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pkgLen = lastSlash - className +1; 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pCtrl->pkgOrClassLen > pkgLen || 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project memcmp(pCtrl->pkgOrClass, className, pCtrl->pkgOrClassLen) != 0) 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 7292c1f6f1b4249e4e379452ee7b49f027052bf4ceSteve Block ALOGV("ASRT: pkg no match: '%s'(%d) vs '%s'", 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project className, pkgLen, pCtrl->pkgOrClass); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 7592c1f6f1b4249e4e379452ee7b49f027052bf4ceSteve Block ALOGV("ASRT: pkg match: '%s'(%d) vs '%s' --> %d", 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project className, pkgLen, pCtrl->pkgOrClass, pCtrl->enable); 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project enable = pCtrl->enable; 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "pkgOrClass" holds a fully-qualified class name, converted from 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dot-form to slash-form. An empty string means all classes. 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (pCtrl->pkgOrClass == NULL) { 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* -esa/-dsa; see if class is a "system" class */ 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (strncmp(className, "java/", 5) != 0) { 8792c1f6f1b4249e4e379452ee7b49f027052bf4ceSteve Block ALOGV("ASRT: sys no match: '%s'", className); 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 8992c1f6f1b4249e4e379452ee7b49f027052bf4ceSteve Block ALOGV("ASRT: sys match: '%s' --> %d", 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project className, pCtrl->enable); 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project enable = pCtrl->enable; 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (*pCtrl->pkgOrClass == '\0') { 9492c1f6f1b4249e4e379452ee7b49f027052bf4ceSteve Block ALOGV("ASRT: class all: '%s' --> %d", 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project className, pCtrl->enable); 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project enable = pCtrl->enable; 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (strcmp(pCtrl->pkgOrClass, className) != 0) { 9992c1f6f1b4249e4e379452ee7b49f027052bf4ceSteve Block ALOGV("ASRT: cls no match: '%s' vs '%s'", 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project className, pCtrl->pkgOrClass); 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 10292c1f6f1b4249e4e379452ee7b49f027052bf4ceSteve Block ALOGV("ASRT: cls match: '%s' vs '%s' --> %d", 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project className, pCtrl->pkgOrClass, pCtrl->enable); 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project enable = pCtrl->enable; 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project free(className); 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_INT(enable); 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * static public Class<?> classForName(String name, boolean initialize, 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ClassLoader loader) 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the Class object associated with the class or interface with 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the specified name. 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "name" is in "binary name" format, e.g. "dalvik.system.Debug$1". 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_classForName(const u4* args, JValue* pResult) 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringObject* nameObj = (StringObject*) args[0]; 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool initialize = (args[1] != 0); 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* loader = (Object*) args[2]; 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(dvmFindClassByName(nameObj, loader, initialize)); 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * static private ClassLoader getClassLoader(Class clazz) 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the class' defining class loader. 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getClassLoader(const u4* args, 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(clazz->classLoader); 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Class<?> getComponentType() 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If this is an array type, return the class of the elements; otherwise 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return NULL. 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getComponentType(const u4* args, 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* thisPtr = (ClassObject*) args[0]; 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmIsArrayClass(thisPtr)) 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(NULL); 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We can't just return thisPtr->elementClass, because that gives 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * us the base type (e.g. X[][][] returns X). If this is a multi- 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dimensional array, we have to do the lookup by name. 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (thisPtr->descriptor[1] == '[') 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(dvmFindArrayClass(&thisPtr->descriptor[1], 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project thisPtr->classLoader)); 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(thisPtr->elementClass); 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private static Class<?>[] getDeclaredClasses(Class<?> clazz, 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * boolean publicOnly) 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return an array with the classes that are declared by the specified class. 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "publicOnly" is set, we strip out any classes that don't have "public" 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * access. 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getDeclaredClasses(const u4* args, 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool publicOnly = (args[1] != 0); 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* classes; 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project classes = dvmGetDeclaredClasses(clazz); 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (classes == NULL) { 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmCheckException(dvmThreadSelf())) { 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* empty list, so create a zero-length array */ 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project classes = dvmAllocArrayByClass(gDvm.classJavaLangClassArray, 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 0, ALLOC_DEFAULT); 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (publicOnly) { 194364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes u4 count, newIdx, publicCount = 0; 195db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro ClassObject** pSource = (ClassObject**)(void*)classes->contents; 196364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes u4 length = classes->length; 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* count up public classes */ 199364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes for (count = 0; count < length; count++) { 200364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes if (dvmIsPublicClass(pSource[count])) 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project publicCount++; 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* create a new array to hold them */ 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* newClasses; 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newClasses = dvmAllocArrayByClass(gDvm.classJavaLangClassArray, 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project publicCount, ALLOC_DEFAULT); 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* copy them over */ 210364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes for (count = newIdx = 0; count < length; count++) { 211364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes if (dvmIsPublicClass(pSource[count])) { 212364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes dvmSetObjectArrayElement(newClasses, newIdx, 213364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes (Object *)pSource[count]); 214364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes newIdx++; 215364f9d924cbd9d392744a66f80cc084c3d80caf0Barry Hayes } 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(newIdx == publicCount); 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) classes, NULL); 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project classes = newClasses; 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) classes, NULL); 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(classes); 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * static Constructor[] getDeclaredConstructors(Class clazz, boolean publicOnly) 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * throws SecurityException 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getDeclaredConstructors(const u4* args, 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool publicOnly = (args[1] != 0); 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* constructors; 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project constructors = dvmGetDeclaredConstructors(clazz, publicOnly); 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) constructors, NULL); 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(constructors); 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * static Field[] getDeclaredFields(Class klass, boolean publicOnly) 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getDeclaredFields(const u4* args, 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool publicOnly = (args[1] != 0); 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* fields; 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fields = dvmGetDeclaredFields(clazz, publicOnly); 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) fields, NULL); 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(fields); 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 260b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson * static Field getDeclaredField(Class klass, String name) 261b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson */ 262b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilsonstatic void Dalvik_java_lang_Class_getDeclaredField(const u4* args, 263b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson JValue* pResult) 264b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson{ 265b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson ClassObject* clazz = (ClassObject*) args[0]; 266b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson StringObject* nameObj = (StringObject*) args[1]; 267b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson Object* fieldObj = dvmGetDeclaredField(clazz, nameObj); 268b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson dvmReleaseTrackedAlloc((Object*) fieldObj, NULL); 269b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson RETURN_PTR(fieldObj); 270b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson} 271b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson 272b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson/* 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * static Method[] getDeclaredMethods(Class clazz, boolean publicOnly) 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * throws SecurityException 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getDeclaredMethods(const u4* args, 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool publicOnly = (args[1] != 0); 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* methods; 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project methods = dvmGetDeclaredMethods(clazz, publicOnly); 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) methods, NULL); 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(methods); 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2903c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson * static native Member getDeclaredConstructorOrMethod( 2913c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson * Class clazz, String name, Class[] args); 2923c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson */ 2933c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilsonstatic void Dalvik_java_lang_Class_getDeclaredConstructorOrMethod( 2943c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson const u4* args, JValue* pResult) 2953c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson{ 2963c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson ClassObject* clazz = (ClassObject*) args[0]; 2973c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson StringObject* nameObj = (StringObject*) args[1]; 2983c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson ArrayObject* methodArgs = (ArrayObject*) args[2]; 2993c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson 3003c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson Object* methodObj; 3013c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson 3023c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson methodObj = dvmGetDeclaredConstructorOrMethod(clazz, nameObj, methodArgs); 3033c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson dvmReleaseTrackedAlloc(methodObj, NULL); 3043c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson 3053c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson RETURN_PTR(methodObj); 3063c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson} 3073c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson 3083c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson/* 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Class[] getInterfaces() 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getInterfaces(const u4* args, 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* interfaces; 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project interfaces = dvmGetInterfaces(clazz); 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) interfaces, NULL); 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(interfaces); 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private static int getModifiers(Class klass, boolean 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ignoreInnerClassesAttrib) 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the class' modifier flags. If "ignoreInnerClassesAttrib" is false, 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and this is an inner class, we return the access flags from the inner class 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * attribute. 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getModifiers(const u4* args, JValue* pResult) 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool ignoreInner = args[1]; 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 accessFlags; 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project accessFlags = clazz->accessFlags & JAVA_FLAGS_MASK; 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!ignoreInner) { 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* see if we have an InnerClass annotation with flags in it */ 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringObject* className = NULL; 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int innerFlags; 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmGetInnerClass(clazz, &className, &innerFlags)) 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project accessFlags = innerFlags & JAVA_FLAGS_MASK; 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) className, NULL); 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_INT(accessFlags); 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 35462c3493b4ca380c1bfcd80d4fc92a5ac9d26ca43Jesse Wilson * private native String getNameNative() 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3565016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * Return the class' name. The exact format is bizarre, but it's the specified 3575016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * behavior: keywords for primitive types, regular "[I" form for primitive 3585016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * arrays (so "int" but "[I"), and arrays of reference types written 3595016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * between "L" and ";" but with dots rather than slashes (so "java.lang.String" 3605016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * but "[Ljava.lang.String;"). Madness. 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 36262c3493b4ca380c1bfcd80d4fc92a5ac9d26ca43Jesse Wilsonstatic void Dalvik_java_lang_Class_getNameNative(const u4* args, JValue* pResult) 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* descriptor = clazz->descriptor; 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringObject* nameObj; 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((descriptor[0] != 'L') && (descriptor[0] != '[')) { 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The descriptor indicates that this is the class for 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a primitive type; special-case the return value. 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* name; 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (descriptor[0]) { 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 'Z': name = "boolean"; break; 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 'B': name = "byte"; break; 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 'C': name = "char"; break; 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 'S': name = "short"; break; 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 'I': name = "int"; break; 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 'J': name = "long"; break; 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 'F': name = "float"; break; 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 'D': name = "double"; break; 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 'V': name = "void"; break; 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: { 385c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block ALOGE("Unknown primitive type '%c'", descriptor[0]); 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(false); 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(NULL); 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39181f3ebe03cd33c9003641084bece0604ee68bf88Barry Hayes nameObj = dvmCreateStringFromCstr(name); 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the UTF-8 name to a java.lang.String. The 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * name must use '.' to separate package components. 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: this could be more efficient. Consider a custom 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * conversion function here that walks the string once and 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * avoids the allocation for the common case (name less than, 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * say, 128 bytes). 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project char* dotName = dvmDescriptorToDot(clazz->descriptor); 40381f3ebe03cd33c9003641084bece0604ee68bf88Barry Hayes nameObj = dvmCreateStringFromCstr(dotName); 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project free(dotName); 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) nameObj, NULL); 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(nameObj); 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the superclass for instances of this class. 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the class represents a java/lang/Object, an interface, a primitive 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * type, or void (which *is* a primitive type??), return NULL. 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For an array, return the java/lang/Object ClassObject. 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getSuperclass(const u4* args, 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmIsPrimitiveClass(clazz) || dvmIsInterfaceClass(clazz)) 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(NULL); 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(clazz->super); 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public boolean isAssignableFrom(Class<?> cls) 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determine if this class is either the same as, or is a superclass or 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * superinterface of, the class specified in the "cls" parameter. 435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_isAssignableFrom(const u4* args, 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* thisPtr = (ClassObject*) args[0]; 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* testClass = (ClassObject*) args[1]; 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (testClass == NULL) { 443a8b4a0eec5e3ab181b3d26223c84c556bead06c8Elliott Hughes dvmThrowNullPointerException("cls == null"); 444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_INT(false); 445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_INT(dvmInstanceof(testClass, thisPtr)); 447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public boolean isInstance(Object o) 451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Dynamic equivalent of Java programming language "instanceof". 453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_isInstance(const u4* args, 455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* thisPtr = (ClassObject*) args[0]; 458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* testObj = (Object*) args[1]; 459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (testObj == NULL) 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_INT(false); 462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_INT(dvmInstanceof(testObj->clazz, thisPtr)); 463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public boolean isInterface() 467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_isInterface(const u4* args, 469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* thisPtr = (ClassObject*) args[0]; 472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_INT(dvmIsInterfaceClass(thisPtr)); 474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public boolean isPrimitive() 478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_isPrimitive(const u4* args, 480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* thisPtr = (ClassObject*) args[0]; 483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_INT(dvmIsPrimitiveClass(thisPtr)); 485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public T newInstance() throws InstantiationException, IllegalAccessException 489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a new instance of this class. 491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_newInstance(const u4* args, JValue* pResult) 493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Thread* self = dvmThreadSelf(); 495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Method* init; 497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* newObj; 498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* can't instantiate these */ 500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmIsPrimitiveClass(clazz) || dvmIsInterfaceClass(clazz) 501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project || dvmIsArrayClass(clazz) || dvmIsAbstractClass(clazz)) 502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 503062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("newInstance failed: p%d i%d [%d a%d", 504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmIsPrimitiveClass(clazz), dvmIsInterfaceClass(clazz), 505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmIsArrayClass(clazz), dvmIsAbstractClass(clazz)); 506bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein dvmThrowInstantiationException(clazz, NULL); 507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* initialize the class if it hasn't been already */ 511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmIsClassInitialized(clazz)) { 512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmInitClass(clazz)) { 513e8e1ddccd616e8226b7cc1e4e9fdb327429249e8Steve Block ALOGW("Class init failed in newInstance call (%s)", 514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clazz->descriptor); 515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(dvmCheckException(self)); 516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* find the "nullary" constructor */ 521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project init = dvmFindDirectMethodByDescriptor(clazz, "<init>", "()V"); 522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (init == NULL) { 523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* common cause: secret "this" arg on non-static inner class ctor */ 524062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("newInstance failed: no <init>()"); 525bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein dvmThrowInstantiationException(clazz, "no empty constructor"); 526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify access from the call site. 531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * First, make sure the method invoking Class.newInstance() has permission 533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to access the class. 534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Second, make sure it has permission to invoke the constructor. The 536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * constructor must be public or, if the caller is in the same package, 537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have package scope. 538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 53930bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee ClassObject* callerClass = dvmGetCaller2Class(self->interpSave.curFrame); 540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmCheckClassAccess(callerClass, clazz)) { 542062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("newInstance failed: %s not accessible to %s", 543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clazz->descriptor, callerClass->descriptor); 544d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein dvmThrowIllegalAccessException("access to class not allowed"); 545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmCheckMethodAccess(callerClass, init)) { 548062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("newInstance failed: %s.<init>() not accessible to %s", 549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clazz->descriptor, callerClass->descriptor); 550d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein dvmThrowIllegalAccessException("access to constructor not allowed"); 551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newObj = dvmAllocObject(clazz, ALLOC_DEFAULT); 555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue unused; 556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* invoke constructor; unlike reflection calls, we don't wrap exceptions */ 558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmCallMethod(self, init, newObj, &unused); 559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc(newObj, NULL); 560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(newObj); 562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private Object[] getSignatureAnnotation() 566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the signature annotation array. 568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getSignatureAnnotation(const u4* args, 570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* arr = dvmGetClassSignatureAnnotation(clazz); 574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) arr, NULL); 576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(arr); 577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Class getDeclaringClass() 581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the class that encloses this class (if any). 583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getDeclaringClass(const u4* args, 585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* enclosing = dvmGetDeclaringClass(clazz); 590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) enclosing, NULL); 591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(enclosing); 592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Class getEnclosingClass() 596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the class that encloses this class (if any). 598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getEnclosingClass(const u4* args, 600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* enclosing = dvmGetEnclosingClass(clazz); 605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) enclosing, NULL); 606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(enclosing); 607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Constructor getEnclosingConstructor() 611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the constructor that encloses this class (if any). 613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getEnclosingConstructor(const u4* args, 615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* enclosing = dvmGetEnclosingMethod(clazz); 620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (enclosing != NULL) { 621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc(enclosing, NULL); 622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (enclosing->clazz == gDvm.classJavaLangReflectConstructor) { 623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(enclosing); 624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(enclosing->clazz == gDvm.classJavaLangReflectMethod); 626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(NULL); 628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Method getEnclosingMethod() 632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the method that encloses this class (if any). 634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getEnclosingMethod(const u4* args, 636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* enclosing = dvmGetEnclosingMethod(clazz); 641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (enclosing != NULL) { 642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc(enclosing, NULL); 643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (enclosing->clazz == gDvm.classJavaLangReflectMethod) { 644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(enclosing); 645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(enclosing->clazz == gDvm.classJavaLangReflectConstructor); 647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(NULL); 649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0 652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getGenericInterfaces(const u4* args, 653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 655d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein dvmThrowUnsupportedOperationException("native method not implemented"); 656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(NULL); 658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getGenericSuperclass(const u4* args, 661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 663d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein dvmThrowUnsupportedOperationException("native method not implemented"); 664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(NULL); 666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getTypeParameters(const u4* args, 669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 671d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein dvmThrowUnsupportedOperationException("native method not implemented"); 672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(NULL); 674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public boolean isAnonymousClass() 679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns true if this is an "anonymous" class. 681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_isAnonymousClass(const u4* args, 683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringObject* className = NULL; 687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int accessFlags; 688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If this has an InnerClass annotation, pull it out. Lack of the 691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * annotation, or an annotation with a NULL class name, indicates 692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that this is an anonymous inner class. 693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!dvmGetInnerClass(clazz, &className, &accessFlags)) 695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_BOOLEAN(false); 696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) className, NULL); 698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_BOOLEAN(className == NULL); 699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private Annotation[] getDeclaredAnnotations() 703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the annotations declared on this class. 705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getDeclaredAnnotations(const u4* args, 707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* annos = dvmGetClassAnnotations(clazz); 712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) annos, NULL); 713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(annos); 714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 717c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson * private Annotation getDeclaredAnnotation(Class annotationClass) 718c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson */ 719c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilsonstatic void Dalvik_java_lang_Class_getDeclaredAnnotation(const u4* args, 720c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson JValue* pResult) 721c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson{ 722c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson ClassObject* clazz = (ClassObject*) args[0]; 723c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson ClassObject* annotationClazz = (ClassObject*) args[1]; 724c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson 725c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson RETURN_PTR(dvmGetClassAnnotation(clazz, annotationClazz)); 726c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson} 727c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson 728c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson/* 729c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson * private boolean isDeclaredAnnotationPresent(Class annotationClass); 730c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson */ 731c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilsonstatic void Dalvik_java_lang_Class_isDeclaredAnnotationPresent(const u4* args, 732c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson JValue* pResult) 733c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson{ 734c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson ClassObject* clazz = (ClassObject*) args[0]; 735c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson ClassObject* annotationClazz = (ClassObject*) args[1]; 736c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson 737c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson RETURN_BOOLEAN(dvmIsClassAnnotationPresent(clazz, annotationClazz)); 738c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson} 739c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson 740c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson/* 741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public String getInnerClassName() 742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 743de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * Returns the simple name of a member class or local class, or null otherwise. 744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_Class_getInnerClassName(const u4* args, 746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JValue* pResult) 747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* clazz = (ClassObject*) args[0]; 749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringObject* nameObj; 750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int flags; 751de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (dvmGetInnerClass(clazz, &nameObj, &flags)) { 753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) nameObj, NULL); 754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(nameObj); 755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(NULL); 757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst DalvikNativeMethod dvm_java_lang_Class[] = { 761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "desiredAssertionStatus", "()Z", 762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_desiredAssertionStatus }, 763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "classForName", "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;", 764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_classForName }, 765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getClassLoader", "(Ljava/lang/Class;)Ljava/lang/ClassLoader;", 766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getClassLoader }, 767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getComponentType", "()Ljava/lang/Class;", 768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getComponentType }, 769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getSignatureAnnotation", "()[Ljava/lang/Object;", 770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getSignatureAnnotation }, 771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getDeclaredClasses", "(Ljava/lang/Class;Z)[Ljava/lang/Class;", 772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getDeclaredClasses }, 773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getDeclaredConstructors", "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;", 774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getDeclaredConstructors }, 775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getDeclaredFields", "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;", 776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getDeclaredFields }, 777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getDeclaredMethods", "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;", 778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getDeclaredMethods }, 779b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson { "getDeclaredField", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;", 780b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson Dalvik_java_lang_Class_getDeclaredField }, 7813c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson { "getDeclaredConstructorOrMethod", "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Member;", 7823c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson Dalvik_java_lang_Class_getDeclaredConstructorOrMethod }, 783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getInterfaces", "()[Ljava/lang/Class;", 784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getInterfaces }, 785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getModifiers", "(Ljava/lang/Class;Z)I", 786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getModifiers }, 78762c3493b4ca380c1bfcd80d4fc92a5ac9d26ca43Jesse Wilson { "getNameNative", "()Ljava/lang/String;", 78862c3493b4ca380c1bfcd80d4fc92a5ac9d26ca43Jesse Wilson Dalvik_java_lang_Class_getNameNative }, 789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getSuperclass", "()Ljava/lang/Class;", 790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getSuperclass }, 791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "isAssignableFrom", "(Ljava/lang/Class;)Z", 792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_isAssignableFrom }, 793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "isInstance", "(Ljava/lang/Object;)Z", 794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_isInstance }, 795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "isInterface", "()Z", 796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_isInterface }, 797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "isPrimitive", "()Z", 798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_isPrimitive }, 799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "newInstanceImpl", "()Ljava/lang/Object;", 800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_newInstance }, 801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getDeclaringClass", "()Ljava/lang/Class;", 802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getDeclaringClass }, 803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getEnclosingClass", "()Ljava/lang/Class;", 804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getEnclosingClass }, 805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getEnclosingConstructor", "()Ljava/lang/reflect/Constructor;", 806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getEnclosingConstructor }, 807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getEnclosingMethod", "()Ljava/lang/reflect/Method;", 808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getEnclosingMethod }, 809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0 810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getGenericInterfaces", "()[Ljava/lang/reflect/Type;", 811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getGenericInterfaces }, 812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getGenericSuperclass", "()Ljava/lang/reflect/Type;", 813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getGenericSuperclass }, 814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getTypeParameters", "()Ljava/lang/reflect/TypeVariable;", 815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getTypeParameters }, 816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "isAnonymousClass", "()Z", 818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_isAnonymousClass }, 819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getDeclaredAnnotations", "()[Ljava/lang/annotation/Annotation;", 820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getDeclaredAnnotations }, 821c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson { "getDeclaredAnnotation", "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", 822c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson Dalvik_java_lang_Class_getDeclaredAnnotation }, 823c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson { "isDeclaredAnnotationPresent", "(Ljava/lang/Class;)Z", 824c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson Dalvik_java_lang_Class_isDeclaredAnnotationPresent }, 825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getInnerClassName", "()Ljava/lang/String;", 826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_Class_getInnerClassName }, 827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { NULL, NULL, NULL }, 828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 829