• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*
18  * java.lang.VMClassLoader
19  */
20 #include "Dalvik.h"
21 #include "native/InternalNativePriv.h"
22 
23 
24 /*
25  * static Class defineClass(ClassLoader cl, String name,
26  *     byte[] data, int offset, int len, ProtectionDomain pd)
27  *     throws ClassFormatError
28  *
29  * Convert an array of bytes to a Class object.
30  */
Dalvik_java_lang_VMClassLoader_defineClass(const u4 * args,JValue * pResult)31 static void Dalvik_java_lang_VMClassLoader_defineClass(const u4* args,
32     JValue* pResult)
33 {
34     Object* loader = (Object*) args[0];
35     StringObject* nameObj = (StringObject*) args[1];
36     const u1* data = (const u1*) args[2];
37     int offset = args[3];
38     int len = args[4];
39     Object* pd = (Object*) args[5];
40     char* name = NULL;
41 
42     name = dvmCreateCstrFromString(nameObj);
43     LOGE("ERROR: defineClass(%p, %s, %p, %d, %d, %p)\n",
44         loader, name, data, offset, len, pd);
45     dvmThrowException("Ljava/lang/UnsupportedOperationException;",
46         "can't load this type of class file");
47 
48     free(name);
49     RETURN_VOID();
50 }
51 
52 /*
53  * static Class defineClass(ClassLoader cl, byte[] data, int offset,
54  *     int len, ProtectionDomain pd)
55  *     throws ClassFormatError
56  *
57  * Convert an array of bytes to a Class object. Deprecated version of
58  * previous method, lacks name parameter.
59  */
Dalvik_java_lang_VMClassLoader_defineClass2(const u4 * args,JValue * pResult)60 static void Dalvik_java_lang_VMClassLoader_defineClass2(const u4* args,
61     JValue* pResult)
62 {
63     Object* loader = (Object*) args[0];
64     const u1* data = (const u1*) args[1];
65     int offset = args[2];
66     int len = args[3];
67     Object* pd = (Object*) args[4];
68 
69     LOGE("ERROR: defineClass(%p, %p, %d, %d, %p)\n",
70         loader, data, offset, len, pd);
71     dvmThrowException("Ljava/lang/UnsupportedOperationException;",
72         "can't load this type of class file");
73 
74     RETURN_VOID();
75 }
76 
77 /*
78  * static Class findLoadedClass(ClassLoader cl, String name)
79  */
Dalvik_java_lang_VMClassLoader_findLoadedClass(const u4 * args,JValue * pResult)80 static void Dalvik_java_lang_VMClassLoader_findLoadedClass(const u4* args,
81     JValue* pResult)
82 {
83     Object* loader = (Object*) args[0];
84     StringObject* nameObj = (StringObject*) args[1];
85     ClassObject* clazz = NULL;
86     char* name = NULL;
87     char* descriptor = NULL;
88     char* cp;
89 
90     if (nameObj == NULL) {
91         dvmThrowException("Ljava/lang/NullPointerException;", NULL);
92         goto bail;
93     }
94 
95     /*
96      * Get a UTF-8 copy of the string, and convert dots to slashes.
97      */
98     name = dvmCreateCstrFromString(nameObj);
99     if (name == NULL)
100         goto bail;
101 
102     descriptor = dvmDotToDescriptor(name);
103     if (descriptor == NULL)
104         goto bail;
105 
106     clazz = dvmLookupClass(descriptor, loader, false);
107     LOGVV("look: %s ldr=%p --> %p\n", descriptor, loader, clazz);
108 
109 bail:
110     free(name);
111     free(descriptor);
112     RETURN_PTR(clazz);
113 }
114 
115 /*
116  * private static int getBootClassPathSize()
117  *
118  * Get the number of entries in the boot class path.
119  */
Dalvik_java_lang_VMClassLoader_getBootClassPathSize(const u4 * args,JValue * pResult)120 static void Dalvik_java_lang_VMClassLoader_getBootClassPathSize(const u4* args,
121     JValue* pResult)
122 {
123     int count = dvmGetBootPathSize();
124     RETURN_INT(count);
125 }
126 
127 /*
128  * private static String getBootClassPathResource(String name, int index)
129  *
130  * Find a resource with a matching name in a boot class path entry.
131  *
132  * This mimics the previous VM interface, since we're sharing class libraries.
133  */
Dalvik_java_lang_VMClassLoader_getBootClassPathResource(const u4 * args,JValue * pResult)134 static void Dalvik_java_lang_VMClassLoader_getBootClassPathResource(
135     const u4* args, JValue* pResult)
136 {
137     StringObject* nameObj = (StringObject*) args[0];
138     StringObject* result;
139     int idx = args[1];
140     char* name;
141 
142     name = dvmCreateCstrFromString(nameObj);
143     if (name == NULL)
144         RETURN_PTR(NULL);
145 
146     result = dvmGetBootPathResource(name, idx);
147     free(name);
148     dvmReleaseTrackedAlloc((Object*)result, NULL);
149     RETURN_PTR(result);
150 }
151 
152 /*
153  * static final Class getPrimitiveClass(char prim_type)
154  */
Dalvik_java_lang_VMClassLoader_getPrimitiveClass(const u4 * args,JValue * pResult)155 static void Dalvik_java_lang_VMClassLoader_getPrimitiveClass(const u4* args,
156     JValue* pResult)
157 {
158     int primType = args[0];
159 
160     pResult->l = dvmFindPrimitiveClass(primType);
161 }
162 
163 /*
164  * static Class loadClass(String name, boolean resolve)
165  *     throws ClassNotFoundException
166  *
167  * Load class using bootstrap class loader.
168  *
169  * Return the Class object associated with the class or interface with
170  * the specified name.
171  *
172  * "name" is in "binary name" format, e.g. "dalvik.system.Debug$1".
173  */
Dalvik_java_lang_VMClassLoader_loadClass(const u4 * args,JValue * pResult)174 static void Dalvik_java_lang_VMClassLoader_loadClass(const u4* args,
175     JValue* pResult)
176 {
177     StringObject* nameObj = (StringObject*) args[0];
178     bool resolve = (args[1] != 0);
179     ClassObject* clazz;
180 
181     clazz = dvmFindClassByName(nameObj, NULL, resolve);
182     assert(clazz == NULL || dvmIsClassLinked(clazz));
183     RETURN_PTR(clazz);
184 }
185 
186 const DalvikNativeMethod dvm_java_lang_VMClassLoader[] = {
187     { "defineClass",        "(Ljava/lang/ClassLoader;Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;",
188         Dalvik_java_lang_VMClassLoader_defineClass },
189     { "defineClass",        "(Ljava/lang/ClassLoader;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;",
190         Dalvik_java_lang_VMClassLoader_defineClass2 },
191     { "findLoadedClass",    "(Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;",
192         Dalvik_java_lang_VMClassLoader_findLoadedClass },
193     { "getBootClassPathSize", "()I",
194         Dalvik_java_lang_VMClassLoader_getBootClassPathSize },
195     { "getBootClassPathResource", "(Ljava/lang/String;I)Ljava/lang/String;",
196         Dalvik_java_lang_VMClassLoader_getBootClassPathResource },
197     { "getPrimitiveClass",  "(C)Ljava/lang/Class;",
198         Dalvik_java_lang_VMClassLoader_getPrimitiveClass },
199     { "loadClass",          "(Ljava/lang/String;Z)Ljava/lang/Class;",
200         Dalvik_java_lang_VMClassLoader_loadClass },
201     { NULL, NULL, NULL },
202 };
203 
204