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.reflect.Method
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 * private int getMethodModifiers(Class decl_class, int slot)
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (Not sure why the access flags weren't stored in the class along with
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * everything else.  Not sure why this isn't static.)
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Method_getMethodModifiers(const u4* args,
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // ignore thisPtr in args[0]
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method* meth;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    meth = dvmSlotToMethod(declaringClass, slot);
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_INT(dvmFixMethodFlags(meth->accessFlags));
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private Object invokeNative(Object obj, Object[] args, Class declaringClass,
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   Class[] parameterTypes, Class returnType, int slot, boolean noAccessCheck)
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invoke a static or virtual method via reflection.
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Method_invokeNative(const u4* args,
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // ignore thisPtr in args[0]
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* methObj = (Object*) args[1];        // null for static methods
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* argList = (ArrayObject*) args[2];
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[3];
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* params = (ArrayObject*) args[4];
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* returnType = (ClassObject*) args[5];
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[6];
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool noAccessCheck = (args[7] != 0);
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const Method* meth;
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* result;
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "If the underlying method is static, the class that declared the
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method is initialized if it has not already been initialized."
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    meth = dvmSlotToMethod(declaringClass, slot);
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(meth != NULL);
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (dvmIsStaticMethod(meth)) {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!dvmIsClassInitialized(declaringClass)) {
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!dvmInitClass(declaringClass))
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                goto init_failed;
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* looks like interfaces need this too? */
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (dvmIsInterfaceClass(declaringClass) &&
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            !dvmIsClassInitialized(declaringClass))
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!dvmInitClass(declaringClass))
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                goto init_failed;
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* make sure the object is an instance of the expected class */
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!dvmVerifyObjectInClass(methObj, declaringClass)) {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assert(dvmCheckException(dvmThreadSelf()));
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            RETURN_VOID();
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* do the virtual table lookup for the method */
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        meth = dvmGetVirtualizedMethod(methObj->clazz, meth);
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (meth == NULL) {
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assert(dvmCheckException(dvmThreadSelf()));
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            RETURN_VOID();
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If the method has a return value, "result" will be an object or
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * a boxed primitive.
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    result = dvmInvokeMethod(methObj, meth, argList, params, returnType,
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                noAccessCheck);
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(result);
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectinit_failed:
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If initialization failed, an exception will be raised.
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    LOGD("Method.invoke() on bad class %s failed\n",
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        declaringClass->descriptor);
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(dvmCheckException(dvmThreadSelf()));
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_VOID();
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Annotation[] getDeclaredAnnotations(Class declaringClass, int slot)
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the annotations declared for this method.
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Method_getDeclaredAnnotations(
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u4* args, JValue* pResult)
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // ignore thisPtr in args[0]
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method* meth;
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    meth = dvmSlotToMethod(declaringClass, slot);
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(meth != NULL);
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* annos = dvmGetMethodAnnotations(meth);
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc((Object*)annos, NULL);
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(annos);
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Annotation[] getParameterAnnotations(Class declaringClass, int slot)
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the annotations declared for this method's parameters.
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Method_getParameterAnnotations(
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u4* args, JValue* pResult)
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // ignore thisPtr in args[0]
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method* meth;
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    meth = dvmSlotToMethod(declaringClass, slot);
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(meth != NULL);
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* annos = dvmGetParameterAnnotations(meth);
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc((Object*)annos, NULL);
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(annos);
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private Object getDefaultValue(Class declaringClass, int slot)
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the default value for the annotation member represented by
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this Method instance.  Returns NULL if none is defined.
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Method_getDefaultValue(const u4* args,
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // ignore thisPtr in args[0]
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method* meth;
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* make sure this is an annotation class member */
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!dvmIsAnnotationClass(declaringClass))
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_PTR(NULL);
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    meth = dvmSlotToMethod(declaringClass, slot);
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(meth != NULL);
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* def = dvmGetAnnotationDefaultValue(meth);
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc(def, NULL);
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(def);
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private Object[] getSignatureAnnotation()
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the signature annotation.
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Method_getSignatureAnnotation(
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u4* args, JValue* pResult)
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // ignore thisPtr in args[0]
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method* meth;
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    meth = dvmSlotToMethod(declaringClass, slot);
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(meth != NULL);
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* arr = dvmGetMethodSignatureAnnotation(meth);
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc((Object*) arr, NULL);
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(arr);
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst DalvikNativeMethod dvm_java_lang_reflect_Method[] = {
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getMethodModifiers", "(Ljava/lang/Class;I)I",
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Method_getMethodModifiers },
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "invokeNative",       "(Ljava/lang/Object;[Ljava/lang/Object;Ljava/lang/Class;[Ljava/lang/Class;Ljava/lang/Class;IZ)Ljava/lang/Object;",
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Method_invokeNative },
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getDeclaredAnnotations", "(Ljava/lang/Class;I)[Ljava/lang/annotation/Annotation;",
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Method_getDeclaredAnnotations },
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getParameterAnnotations", "(Ljava/lang/Class;I)[[Ljava/lang/annotation/Annotation;",
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Method_getParameterAnnotations },
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getDefaultValue",    "(Ljava/lang/Class;I)Ljava/lang/Object;",
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Method_getDefaultValue },
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getSignatureAnnotation",  "(Ljava/lang/Class;I)[Ljava/lang/Object;",
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Method_getSignatureAnnotation },
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { NULL, NULL, NULL },
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
221