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