| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2012 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 | #include "well_known_classes.h" | 
 | 18 |  | 
 | 19 | #include <stdlib.h> | 
 | 20 |  | 
 | 21 | #include "logging.h" | 
 | 22 | #include "ScopedLocalRef.h" | 
| Elliott Hughes | af8d15a | 2012-05-29 09:12:18 -0700 | [diff] [blame] | 23 | #include "thread.h" | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 24 |  | 
 | 25 | namespace art { | 
 | 26 |  | 
 | 27 | jclass WellKnownClasses::com_android_dex_Dex; | 
| Ian Rogers | 00f7d0e | 2012-07-19 15:28:27 -0700 | [diff] [blame] | 28 | jclass WellKnownClasses::dalvik_system_PathClassLoader; | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 29 | jclass WellKnownClasses::java_lang_ClassLoader; | 
 | 30 | jclass WellKnownClasses::java_lang_ClassNotFoundException; | 
 | 31 | jclass WellKnownClasses::java_lang_Daemons; | 
 | 32 | jclass WellKnownClasses::java_lang_Error; | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 33 | jclass WellKnownClasses::java_lang_reflect_InvocationHandler; | 
| Mathieu Chartier | 66f1925 | 2012-09-18 08:57:04 -0700 | [diff] [blame^] | 34 | jclass WellKnownClasses::java_lang_reflect_AbstractMethod; | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 35 | jclass WellKnownClasses::java_lang_reflect_Proxy; | 
| Elliott Hughes | a4f9474 | 2012-05-29 16:28:38 -0700 | [diff] [blame] | 36 | jclass WellKnownClasses::java_lang_RuntimeException; | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 37 | jclass WellKnownClasses::java_lang_Thread; | 
| Elliott Hughes | af8d15a | 2012-05-29 09:12:18 -0700 | [diff] [blame] | 38 | jclass WellKnownClasses::java_lang_Thread$UncaughtExceptionHandler; | 
 | 39 | jclass WellKnownClasses::java_lang_ThreadGroup; | 
 | 40 | jclass WellKnownClasses::java_lang_ThreadLock; | 
| Elliott Hughes | a4f9474 | 2012-05-29 16:28:38 -0700 | [diff] [blame] | 41 | jclass WellKnownClasses::java_lang_Throwable; | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 42 | jclass WellKnownClasses::java_nio_ReadWriteDirectByteBuffer; | 
 | 43 | jclass WellKnownClasses::org_apache_harmony_dalvik_ddmc_Chunk; | 
 | 44 | jclass WellKnownClasses::org_apache_harmony_dalvik_ddmc_DdmServer; | 
 | 45 |  | 
 | 46 | jmethodID WellKnownClasses::com_android_dex_Dex_create; | 
| Ian Rogers | 00f7d0e | 2012-07-19 15:28:27 -0700 | [diff] [blame] | 47 | jmethodID WellKnownClasses::java_lang_Boolean_valueOf; | 
 | 48 | jmethodID WellKnownClasses::java_lang_Byte_valueOf; | 
 | 49 | jmethodID WellKnownClasses::java_lang_Character_valueOf; | 
| Elliott Hughes | a4f9474 | 2012-05-29 16:28:38 -0700 | [diff] [blame] | 50 | jmethodID WellKnownClasses::java_lang_ClassLoader_loadClass; | 
| Ian Rogers | 00f7d0e | 2012-07-19 15:28:27 -0700 | [diff] [blame] | 51 | jmethodID WellKnownClasses::java_lang_ClassNotFoundException_init; | 
| Mathieu Chartier | 7664f5c | 2012-06-08 18:15:32 -0700 | [diff] [blame] | 52 | jmethodID WellKnownClasses::java_lang_Daemons_requestGC; | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 53 | jmethodID WellKnownClasses::java_lang_Daemons_requestHeapTrim; | 
 | 54 | jmethodID WellKnownClasses::java_lang_Daemons_start; | 
| Ian Rogers | 00f7d0e | 2012-07-19 15:28:27 -0700 | [diff] [blame] | 55 | jmethodID WellKnownClasses::java_lang_Double_valueOf; | 
 | 56 | jmethodID WellKnownClasses::java_lang_Float_valueOf; | 
 | 57 | jmethodID WellKnownClasses::java_lang_Integer_valueOf; | 
 | 58 | jmethodID WellKnownClasses::java_lang_Long_valueOf; | 
| Elliott Hughes | a4f9474 | 2012-05-29 16:28:38 -0700 | [diff] [blame] | 59 | jmethodID WellKnownClasses::java_lang_ref_FinalizerReference_add; | 
 | 60 | jmethodID WellKnownClasses::java_lang_ref_ReferenceQueue_add; | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 61 | jmethodID WellKnownClasses::java_lang_reflect_InvocationHandler_invoke; | 
| Ian Rogers | 00f7d0e | 2012-07-19 15:28:27 -0700 | [diff] [blame] | 62 | jmethodID WellKnownClasses::java_lang_Short_valueOf; | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 63 | jmethodID WellKnownClasses::java_lang_Thread_init; | 
| Elliott Hughes | af8d15a | 2012-05-29 09:12:18 -0700 | [diff] [blame] | 64 | jmethodID WellKnownClasses::java_lang_Thread_run; | 
 | 65 | jmethodID WellKnownClasses::java_lang_Thread$UncaughtExceptionHandler_uncaughtException; | 
 | 66 | jmethodID WellKnownClasses::java_lang_ThreadGroup_removeThread; | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 67 | jmethodID WellKnownClasses::java_nio_ReadWriteDirectByteBuffer_init; | 
 | 68 | jmethodID WellKnownClasses::org_apache_harmony_dalvik_ddmc_DdmServer_broadcast; | 
 | 69 | jmethodID WellKnownClasses::org_apache_harmony_dalvik_ddmc_DdmServer_dispatch; | 
 | 70 |  | 
| Elliott Hughes | af8d15a | 2012-05-29 09:12:18 -0700 | [diff] [blame] | 71 | jfieldID WellKnownClasses::java_lang_Thread_daemon; | 
 | 72 | jfieldID WellKnownClasses::java_lang_Thread_group; | 
 | 73 | jfieldID WellKnownClasses::java_lang_Thread_lock; | 
 | 74 | jfieldID WellKnownClasses::java_lang_Thread_name; | 
 | 75 | jfieldID WellKnownClasses::java_lang_Thread_priority; | 
 | 76 | jfieldID WellKnownClasses::java_lang_Thread_uncaughtHandler; | 
 | 77 | jfieldID WellKnownClasses::java_lang_Thread_vmData; | 
 | 78 | jfieldID WellKnownClasses::java_lang_ThreadGroup_mainThreadGroup; | 
 | 79 | jfieldID WellKnownClasses::java_lang_ThreadGroup_name; | 
 | 80 | jfieldID WellKnownClasses::java_lang_ThreadGroup_systemThreadGroup; | 
 | 81 | jfieldID WellKnownClasses::java_lang_ThreadLock_thread; | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 82 | jfieldID WellKnownClasses::java_lang_reflect_Proxy_h; | 
 | 83 | jfieldID WellKnownClasses::java_nio_ReadWriteDirectByteBuffer_capacity; | 
 | 84 | jfieldID WellKnownClasses::java_nio_ReadWriteDirectByteBuffer_effectiveDirectAddress; | 
 | 85 | jfieldID WellKnownClasses::org_apache_harmony_dalvik_ddmc_Chunk_data; | 
 | 86 | jfieldID WellKnownClasses::org_apache_harmony_dalvik_ddmc_Chunk_length; | 
 | 87 | jfieldID WellKnownClasses::org_apache_harmony_dalvik_ddmc_Chunk_offset; | 
 | 88 | jfieldID WellKnownClasses::org_apache_harmony_dalvik_ddmc_Chunk_type; | 
 | 89 |  | 
 | 90 | static jclass CacheClass(JNIEnv* env, const char* jni_class_name) { | 
 | 91 |   ScopedLocalRef<jclass> c(env, env->FindClass(jni_class_name)); | 
 | 92 |   if (c.get() == NULL) { | 
 | 93 |     LOG(FATAL) << "Couldn't find class: " << jni_class_name; | 
 | 94 |   } | 
 | 95 |   return reinterpret_cast<jclass>(env->NewGlobalRef(c.get())); | 
 | 96 | } | 
 | 97 |  | 
| Elliott Hughes | af8d15a | 2012-05-29 09:12:18 -0700 | [diff] [blame] | 98 | static jfieldID CacheField(JNIEnv* env, jclass c, bool is_static, const char* name, const char* signature) { | 
 | 99 |   jfieldID fid = is_static ? env->GetStaticFieldID(c, name, signature) : env->GetFieldID(c, name, signature); | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 100 |   if (fid == NULL) { | 
 | 101 |     LOG(FATAL) << "Couldn't find field \"" << name << "\" with signature \"" << signature << "\""; | 
 | 102 |   } | 
 | 103 |   return fid; | 
 | 104 | } | 
 | 105 |  | 
 | 106 | static jmethodID CacheMethod(JNIEnv* env, jclass c, bool is_static, const char* name, const char* signature) { | 
 | 107 |   jmethodID mid = is_static ? env->GetStaticMethodID(c, name, signature) : env->GetMethodID(c, name, signature); | 
 | 108 |   if (mid == NULL) { | 
 | 109 |     LOG(FATAL) << "Couldn't find method \"" << name << "\" with signature \"" << signature << "\""; | 
 | 110 |   } | 
 | 111 |   return mid; | 
 | 112 | } | 
 | 113 |  | 
| Ian Rogers | 00f7d0e | 2012-07-19 15:28:27 -0700 | [diff] [blame] | 114 | static jmethodID CachePrimitiveBoxingMethod(JNIEnv* env, char prim_name, const char* boxed_name) { | 
 | 115 |   ScopedLocalRef<jclass> boxed_class(env, env->FindClass(boxed_name)); | 
 | 116 |   return CacheMethod(env, boxed_class.get(), true, "valueOf", | 
 | 117 |                      StringPrintf("(%c)L%s;", prim_name, boxed_name).c_str()); | 
 | 118 | } | 
 | 119 |  | 
 | 120 | void WellKnownClasses::InitClasses(JNIEnv* env) { | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 121 |   com_android_dex_Dex = CacheClass(env, "com/android/dex/Dex"); | 
| Ian Rogers | 00f7d0e | 2012-07-19 15:28:27 -0700 | [diff] [blame] | 122 |   dalvik_system_PathClassLoader = CacheClass(env, "dalvik/system/PathClassLoader"); | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 123 |   java_lang_ClassLoader = CacheClass(env, "java/lang/ClassLoader"); | 
 | 124 |   java_lang_ClassNotFoundException = CacheClass(env, "java/lang/ClassNotFoundException"); | 
 | 125 |   java_lang_Daemons = CacheClass(env, "java/lang/Daemons"); | 
 | 126 |   java_lang_Error = CacheClass(env, "java/lang/Error"); | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 127 |   java_lang_reflect_InvocationHandler = CacheClass(env, "java/lang/reflect/InvocationHandler"); | 
| Mathieu Chartier | 66f1925 | 2012-09-18 08:57:04 -0700 | [diff] [blame^] | 128 |   java_lang_reflect_AbstractMethod = CacheClass(env, "java/lang/reflect/AbstractMethod"); | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 129 |   java_lang_reflect_Proxy = CacheClass(env, "java/lang/reflect/Proxy"); | 
| Elliott Hughes | a4f9474 | 2012-05-29 16:28:38 -0700 | [diff] [blame] | 130 |   java_lang_RuntimeException = CacheClass(env, "java/lang/RuntimeException"); | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 131 |   java_lang_Thread = CacheClass(env, "java/lang/Thread"); | 
| Elliott Hughes | af8d15a | 2012-05-29 09:12:18 -0700 | [diff] [blame] | 132 |   java_lang_Thread$UncaughtExceptionHandler = CacheClass(env, "java/lang/Thread$UncaughtExceptionHandler"); | 
 | 133 |   java_lang_ThreadGroup = CacheClass(env, "java/lang/ThreadGroup"); | 
 | 134 |   java_lang_ThreadLock = CacheClass(env, "java/lang/ThreadLock"); | 
| Elliott Hughes | a4f9474 | 2012-05-29 16:28:38 -0700 | [diff] [blame] | 135 |   java_lang_Throwable = CacheClass(env, "java/lang/Throwable"); | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 136 |   java_nio_ReadWriteDirectByteBuffer = CacheClass(env, "java/nio/ReadWriteDirectByteBuffer"); | 
 | 137 |   org_apache_harmony_dalvik_ddmc_Chunk = CacheClass(env, "org/apache/harmony/dalvik/ddmc/Chunk"); | 
 | 138 |   org_apache_harmony_dalvik_ddmc_DdmServer = CacheClass(env, "org/apache/harmony/dalvik/ddmc/DdmServer"); | 
| Ian Rogers | 00f7d0e | 2012-07-19 15:28:27 -0700 | [diff] [blame] | 139 | } | 
 | 140 |  | 
 | 141 | void WellKnownClasses::Init(JNIEnv* env) { | 
 | 142 |   InitClasses(env); | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 143 |  | 
 | 144 |   com_android_dex_Dex_create = CacheMethod(env, com_android_dex_Dex, true, "create", "(Ljava/nio/ByteBuffer;)Lcom/android/dex/Dex;"); | 
 | 145 |   java_lang_ClassNotFoundException_init = CacheMethod(env, java_lang_ClassNotFoundException, false, "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V"); | 
| Elliott Hughes | a4f9474 | 2012-05-29 16:28:38 -0700 | [diff] [blame] | 146 |   java_lang_ClassLoader_loadClass = CacheMethod(env, java_lang_ClassLoader, false, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); | 
| Mathieu Chartier | 7664f5c | 2012-06-08 18:15:32 -0700 | [diff] [blame] | 147 |  | 
 | 148 |   java_lang_Daemons_requestGC = CacheMethod(env, java_lang_Daemons, true, "requestGC", "()V"); | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 149 |   java_lang_Daemons_requestHeapTrim = CacheMethod(env, java_lang_Daemons, true, "requestHeapTrim", "()V"); | 
 | 150 |   java_lang_Daemons_start = CacheMethod(env, java_lang_Daemons, true, "start", "()V"); | 
| Elliott Hughes | a4f9474 | 2012-05-29 16:28:38 -0700 | [diff] [blame] | 151 |  | 
 | 152 |   ScopedLocalRef<jclass> java_lang_ref_FinalizerReference(env, env->FindClass("java/lang/ref/FinalizerReference")); | 
 | 153 |   java_lang_ref_FinalizerReference_add = CacheMethod(env, java_lang_ref_FinalizerReference.get(), true, "add", "(Ljava/lang/Object;)V"); | 
 | 154 |   ScopedLocalRef<jclass> java_lang_ref_ReferenceQueue(env, env->FindClass("java/lang/ref/ReferenceQueue")); | 
 | 155 |   java_lang_ref_ReferenceQueue_add = CacheMethod(env, java_lang_ref_ReferenceQueue.get(), true, "add", "(Ljava/lang/ref/Reference;)V"); | 
 | 156 |  | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 157 |   java_lang_reflect_InvocationHandler_invoke = CacheMethod(env, java_lang_reflect_InvocationHandler, false, "invoke", "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;"); | 
 | 158 |   java_lang_Thread_init = CacheMethod(env, java_lang_Thread, false, "<init>", "(Ljava/lang/ThreadGroup;Ljava/lang/String;IZ)V"); | 
| Elliott Hughes | af8d15a | 2012-05-29 09:12:18 -0700 | [diff] [blame] | 159 |   java_lang_Thread_run = CacheMethod(env, java_lang_Thread, false, "run", "()V"); | 
 | 160 |   java_lang_Thread$UncaughtExceptionHandler_uncaughtException = CacheMethod(env, java_lang_Thread$UncaughtExceptionHandler, false, "uncaughtException", "(Ljava/lang/Thread;Ljava/lang/Throwable;)V"); | 
 | 161 |   java_lang_ThreadGroup_removeThread = CacheMethod(env, java_lang_ThreadGroup, false, "removeThread", "(Ljava/lang/Thread;)V"); | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 162 |   java_nio_ReadWriteDirectByteBuffer_init = CacheMethod(env, java_nio_ReadWriteDirectByteBuffer, false, "<init>", "(II)V"); | 
 | 163 |   org_apache_harmony_dalvik_ddmc_DdmServer_broadcast = CacheMethod(env, org_apache_harmony_dalvik_ddmc_DdmServer, true, "broadcast", "(I)V"); | 
 | 164 |   org_apache_harmony_dalvik_ddmc_DdmServer_dispatch = CacheMethod(env, org_apache_harmony_dalvik_ddmc_DdmServer, true, "dispatch", "(I[BII)Lorg/apache/harmony/dalvik/ddmc/Chunk;"); | 
 | 165 |  | 
| Elliott Hughes | af8d15a | 2012-05-29 09:12:18 -0700 | [diff] [blame] | 166 |   java_lang_Thread_daemon = CacheField(env, java_lang_Thread, false, "daemon", "Z"); | 
 | 167 |   java_lang_Thread_group = CacheField(env, java_lang_Thread, false, "group", "Ljava/lang/ThreadGroup;"); | 
 | 168 |   java_lang_Thread_lock = CacheField(env, java_lang_Thread, false, "lock", "Ljava/lang/ThreadLock;"); | 
 | 169 |   java_lang_Thread_name = CacheField(env, java_lang_Thread, false, "name", "Ljava/lang/String;"); | 
 | 170 |   java_lang_Thread_priority = CacheField(env, java_lang_Thread, false, "priority", "I"); | 
 | 171 |   java_lang_Thread_uncaughtHandler = CacheField(env, java_lang_Thread, false, "uncaughtHandler", "Ljava/lang/Thread$UncaughtExceptionHandler;"); | 
 | 172 |   java_lang_Thread_vmData = CacheField(env, java_lang_Thread, false, "vmData", "I"); | 
 | 173 |   java_lang_ThreadGroup_mainThreadGroup = CacheField(env, java_lang_ThreadGroup, true, "mainThreadGroup", "Ljava/lang/ThreadGroup;"); | 
 | 174 |   java_lang_ThreadGroup_name = CacheField(env, java_lang_ThreadGroup, false, "name", "Ljava/lang/String;"); | 
 | 175 |   java_lang_ThreadGroup_systemThreadGroup = CacheField(env, java_lang_ThreadGroup, true, "systemThreadGroup", "Ljava/lang/ThreadGroup;"); | 
 | 176 |   java_lang_ThreadLock_thread = CacheField(env, java_lang_ThreadLock, false, "thread", "Ljava/lang/Thread;"); | 
 | 177 |   java_lang_reflect_Proxy_h = CacheField(env, java_lang_reflect_Proxy, false, "h", "Ljava/lang/reflect/InvocationHandler;"); | 
 | 178 |   java_nio_ReadWriteDirectByteBuffer_capacity = CacheField(env, java_nio_ReadWriteDirectByteBuffer, false, "capacity", "I"); | 
 | 179 |   java_nio_ReadWriteDirectByteBuffer_effectiveDirectAddress = CacheField(env, java_nio_ReadWriteDirectByteBuffer, false, "effectiveDirectAddress", "I"); | 
 | 180 |   org_apache_harmony_dalvik_ddmc_Chunk_data = CacheField(env, org_apache_harmony_dalvik_ddmc_Chunk, false, "data", "[B"); | 
 | 181 |   org_apache_harmony_dalvik_ddmc_Chunk_length = CacheField(env, org_apache_harmony_dalvik_ddmc_Chunk, false, "length", "I"); | 
 | 182 |   org_apache_harmony_dalvik_ddmc_Chunk_offset = CacheField(env, org_apache_harmony_dalvik_ddmc_Chunk, false, "offset", "I"); | 
 | 183 |   org_apache_harmony_dalvik_ddmc_Chunk_type = CacheField(env, org_apache_harmony_dalvik_ddmc_Chunk, false, "type", "I"); | 
| Ian Rogers | 00f7d0e | 2012-07-19 15:28:27 -0700 | [diff] [blame] | 184 |  | 
 | 185 |   java_lang_Boolean_valueOf = CachePrimitiveBoxingMethod(env, 'Z', "java/lang/Boolean"); | 
 | 186 |   java_lang_Byte_valueOf = CachePrimitiveBoxingMethod(env, 'B', "java/lang/Byte"); | 
 | 187 |   java_lang_Character_valueOf = CachePrimitiveBoxingMethod(env, 'C', "java/lang/Character"); | 
 | 188 |   java_lang_Double_valueOf = CachePrimitiveBoxingMethod(env, 'D', "java/lang/Double"); | 
 | 189 |   java_lang_Float_valueOf = CachePrimitiveBoxingMethod(env, 'F', "java/lang/Float"); | 
 | 190 |   java_lang_Integer_valueOf = CachePrimitiveBoxingMethod(env, 'I', "java/lang/Integer"); | 
 | 191 |   java_lang_Long_valueOf = CachePrimitiveBoxingMethod(env, 'J', "java/lang/Long"); | 
 | 192 |   java_lang_Short_valueOf = CachePrimitiveBoxingMethod(env, 'S', "java/lang/Short"); | 
| Elliott Hughes | af8d15a | 2012-05-29 09:12:18 -0700 | [diff] [blame] | 193 | } | 
 | 194 |  | 
 | 195 | Class* WellKnownClasses::ToClass(jclass global_jclass) { | 
 | 196 |   return reinterpret_cast<Class*>(Thread::Current()->DecodeJObject(global_jclass)); | 
| Elliott Hughes | eac7667 | 2012-05-24 21:56:51 -0700 | [diff] [blame] | 197 | } | 
 | 198 |  | 
 | 199 | }  // namespace art |