1eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes/*
2eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes * Copyright (C) 2012 The Android Open Source Project
3eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes *
4eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
5eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes * you may not use this file except in compliance with the License.
6eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes * You may obtain a copy of the License at
7eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes *
8eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
9eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes *
10eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes * Unless required by applicable law or agreed to in writing, software
11eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes * See the License for the specific language governing permissions and
14eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes * limitations under the License.
15eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes */
16eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
17eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes#include "well_known_classes.h"
18eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
19eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes#include <stdlib.h>
20eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
21c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers#include <sstream>
22c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers
2307ed66b5ae659c452cbe1ab20c3dbf1d6f546461Elliott Hughes#include "base/logging.h"
242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class.h"
25e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "mirror/throwable.h"
26eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes#include "ScopedLocalRef.h"
273c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom#include "scoped_thread_state_change.h"
28a3d2718d1fac53210b2a311b1728409d6c8e7b9dBrian Carlstrom#include "thread-inl.h"
29eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
30eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughesnamespace art {
31eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
32eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughesjclass WellKnownClasses::com_android_dex_Dex;
336bcae8fa93684af581d16400f360541d39e5b5e6Mathieu Chartierjclass WellKnownClasses::dalvik_system_DexFile;
346bcae8fa93684af581d16400f360541d39e5b5e6Mathieu Chartierjclass WellKnownClasses::dalvik_system_DexPathList;
35c8ccf68b805c92674545f63e0341ba47e8d9701cAndreas Gampejclass WellKnownClasses::dalvik_system_DexPathList__Element;
3600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersjclass WellKnownClasses::dalvik_system_PathClassLoader;
37b5de3bb65556950d5cce1dea3ea6d80adcc5051dMathieu Chartierjclass WellKnownClasses::dalvik_system_VMRuntime;
3813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haojclass WellKnownClasses::java_lang_annotation_Annotation__array;
396bcae8fa93684af581d16400f360541d39e5b5e6Mathieu Chartierjclass WellKnownClasses::java_lang_BootClassLoader;
40eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughesjclass WellKnownClasses::java_lang_ClassLoader;
41eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughesjclass WellKnownClasses::java_lang_ClassNotFoundException;
42eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughesjclass WellKnownClasses::java_lang_Daemons;
43eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughesjclass WellKnownClasses::java_lang_Error;
447c8aa8357196781c811a73d2eb66aaaa1681ce36Jeff Haojclass WellKnownClasses::java_lang_ExceptionInInitializerError;
457c8aa8357196781c811a73d2eb66aaaa1681ce36Jeff Haojclass WellKnownClasses::java_lang_IllegalAccessError;
467c8aa8357196781c811a73d2eb66aaaa1681ce36Jeff Haojclass WellKnownClasses::java_lang_NoClassDefFoundError;
47af6e67a4816d2593586115b89faa659225363246Ian Rogersjclass WellKnownClasses::java_lang_Object;
48a61894d88fabe45677f491c9f6bde30059a49026Mathieu Chartierjclass WellKnownClasses::java_lang_OutOfMemoryError;
4966f19258f9728d4ffe026074d8fd429d639802faMathieu Chartierjclass WellKnownClasses::java_lang_reflect_AbstractMethod;
50ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromjclass WellKnownClasses::java_lang_reflect_Constructor;
51ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromjclass WellKnownClasses::java_lang_reflect_Field;
52ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromjclass WellKnownClasses::java_lang_reflect_Method;
53eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughesjclass WellKnownClasses::java_lang_reflect_Proxy;
54a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughesjclass WellKnownClasses::java_lang_RuntimeException;
55120f1c74a9768e958377b6c97897511b27ae58c8Ian Rogersjclass WellKnownClasses::java_lang_StackOverflowError;
56dd157d732b557a854b3689faf8a24170fb47c270Ian Rogersjclass WellKnownClasses::java_lang_String;
57848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Haojclass WellKnownClasses::java_lang_StringFactory;
58987ccff48fe2c0645756e1089608e4b6b7e9f7bfMathieu Chartierjclass WellKnownClasses::java_lang_System;
59eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughesjclass WellKnownClasses::java_lang_Thread;
60c8ccf68b805c92674545f63e0341ba47e8d9701cAndreas Gampejclass WellKnownClasses::java_lang_Thread__UncaughtExceptionHandler;
61af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughesjclass WellKnownClasses::java_lang_ThreadGroup;
62a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughesjclass WellKnownClasses::java_lang_Throwable;
63aecb5f3fd5dcd78bc3e74993acc40fed815b6b8bElliott Hughesjclass WellKnownClasses::java_nio_DirectByteBuffer;
64e49e195c4bc2f20df0289c0bbb46f56839308ddeSebastien Hertzjclass WellKnownClasses::java_util_ArrayList;
657ea6f79bbddd69d5db86a8656a31aaaf64ae2582Andreas Gampejclass WellKnownClasses::java_util_Collections;
6613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haojclass WellKnownClasses::libcore_reflect_AnnotationFactory;
6713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haojclass WellKnownClasses::libcore_reflect_AnnotationMember;
687ea6f79bbddd69d5db86a8656a31aaaf64ae2582Andreas Gampejclass WellKnownClasses::libcore_util_EmptyArray;
69eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughesjclass WellKnownClasses::org_apache_harmony_dalvik_ddmc_Chunk;
70eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughesjclass WellKnownClasses::org_apache_harmony_dalvik_ddmc_DdmServer;
71eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
72eac766769e3114a078c188ea26776a81f0edb3cfElliott HughesjmethodID WellKnownClasses::com_android_dex_Dex_create;
73b5de3bb65556950d5cce1dea3ea6d80adcc5051dMathieu ChartierjmethodID WellKnownClasses::dalvik_system_VMRuntime_runFinalization;
7400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan RogersjmethodID WellKnownClasses::java_lang_Boolean_valueOf;
7500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan RogersjmethodID WellKnownClasses::java_lang_Byte_valueOf;
7600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan RogersjmethodID WellKnownClasses::java_lang_Character_valueOf;
77a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott HughesjmethodID WellKnownClasses::java_lang_ClassLoader_loadClass;
7800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan RogersjmethodID WellKnownClasses::java_lang_ClassNotFoundException_init;
79eac766769e3114a078c188ea26776a81f0edb3cfElliott HughesjmethodID WellKnownClasses::java_lang_Daemons_requestHeapTrim;
80eac766769e3114a078c188ea26776a81f0edb3cfElliott HughesjmethodID WellKnownClasses::java_lang_Daemons_start;
81cef50f0487929f72183623bc2a5819cf3a63bff6Mathieu ChartierjmethodID WellKnownClasses::java_lang_Daemons_stop;
8200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan RogersjmethodID WellKnownClasses::java_lang_Double_valueOf;
8300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan RogersjmethodID WellKnownClasses::java_lang_Float_valueOf;
8400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan RogersjmethodID WellKnownClasses::java_lang_Integer_valueOf;
8500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan RogersjmethodID WellKnownClasses::java_lang_Long_valueOf;
86a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott HughesjmethodID WellKnownClasses::java_lang_ref_FinalizerReference_add;
87a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott HughesjmethodID WellKnownClasses::java_lang_ref_ReferenceQueue_add;
88ea46f950e7a51585db293cd7f047de190a482414Brian CarlstromjmethodID WellKnownClasses::java_lang_reflect_Proxy_invoke;
89ef28b14268ed0f9db0c7bbd571aa514354a360bdIan RogersjmethodID WellKnownClasses::java_lang_Runtime_nativeLoad;
9000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan RogersjmethodID WellKnownClasses::java_lang_Short_valueOf;
91848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init;
92848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_B;
93848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_BI;
94848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_BII;
95848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_BIII;
96848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_BIIString;
97848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_BString;
98848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_BIICharset;
99848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_BCharset;
100848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_C;
101848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_CII;
102848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_IIC;
103848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_String;
104848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_StringBuffer;
105848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_III;
106848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_String_init_StringBuilder;
107848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newEmptyString;
108848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromBytes_B;
109848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BI;
110848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BII;
111848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BIII;
112848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BIIString;
113848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BString;
114848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BIICharset;
115848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BCharset;
116848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromChars_C;
117848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromChars_CII;
118848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromChars_IIC;
119848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromString;
120848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromStringBuffer;
121848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromCodePoints;
122848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::java_lang_StringFactory_newStringFromStringBuilder;
1232cebb24bfc3247d3e9be138a3350106737455918Mathieu ChartierjmethodID WellKnownClasses::java_lang_System_runFinalization = nullptr;
124eac766769e3114a078c188ea26776a81f0edb3cfElliott HughesjmethodID WellKnownClasses::java_lang_Thread_init;
125af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott HughesjmethodID WellKnownClasses::java_lang_Thread_run;
126c8ccf68b805c92674545f63e0341ba47e8d9701cAndreas GampejmethodID WellKnownClasses::java_lang_Thread__UncaughtExceptionHandler_uncaughtException;
127af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott HughesjmethodID WellKnownClasses::java_lang_ThreadGroup_removeThread;
128aecb5f3fd5dcd78bc3e74993acc40fed815b6b8bElliott HughesjmethodID WellKnownClasses::java_nio_DirectByteBuffer_init;
12913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff HaojmethodID WellKnownClasses::libcore_reflect_AnnotationFactory_createAnnotation;
13013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff HaojmethodID WellKnownClasses::libcore_reflect_AnnotationMember_init;
131eac766769e3114a078c188ea26776a81f0edb3cfElliott HughesjmethodID WellKnownClasses::org_apache_harmony_dalvik_ddmc_DdmServer_broadcast;
132eac766769e3114a078c188ea26776a81f0edb3cfElliott HughesjmethodID WellKnownClasses::org_apache_harmony_dalvik_ddmc_DdmServer_dispatch;
133eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
1346bcae8fa93684af581d16400f360541d39e5b5e6Mathieu ChartierjfieldID WellKnownClasses::dalvik_system_DexFile_cookie;
135fbc31087932a65e036a153afab3049dc5298656aMathieu ChartierjfieldID WellKnownClasses::dalvik_system_DexFile_fileName;
1366bcae8fa93684af581d16400f360541d39e5b5e6Mathieu ChartierjfieldID WellKnownClasses::dalvik_system_PathClassLoader_pathList;
1376bcae8fa93684af581d16400f360541d39e5b5e6Mathieu ChartierjfieldID WellKnownClasses::dalvik_system_DexPathList_dexElements;
138c8ccf68b805c92674545f63e0341ba47e8d9701cAndreas GampejfieldID WellKnownClasses::dalvik_system_DexPathList__Element_dexFile;
139af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott HughesjfieldID WellKnownClasses::java_lang_Thread_daemon;
140af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott HughesjfieldID WellKnownClasses::java_lang_Thread_group;
141af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott HughesjfieldID WellKnownClasses::java_lang_Thread_lock;
142af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott HughesjfieldID WellKnownClasses::java_lang_Thread_name;
143af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott HughesjfieldID WellKnownClasses::java_lang_Thread_priority;
144af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott HughesjfieldID WellKnownClasses::java_lang_Thread_uncaughtHandler;
1453c50a4b4ba6d7d9369ee9a0bd6d30bf4c9c79bb0Anwar GhuloumjfieldID WellKnownClasses::java_lang_Thread_nativePeer;
146e49e195c4bc2f20df0289c0bbb46f56839308ddeSebastien HertzjfieldID WellKnownClasses::java_lang_ThreadGroup_groups;
147464595f53abe4370ee6f589eb472e2036e39bce7Przemyslaw SzczepaniakjfieldID WellKnownClasses::java_lang_ThreadGroup_ngroups;
148af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott HughesjfieldID WellKnownClasses::java_lang_ThreadGroup_mainThreadGroup;
149af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott HughesjfieldID WellKnownClasses::java_lang_ThreadGroup_name;
150e49e195c4bc2f20df0289c0bbb46f56839308ddeSebastien HertzjfieldID WellKnownClasses::java_lang_ThreadGroup_parent;
151af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott HughesjfieldID WellKnownClasses::java_lang_ThreadGroup_systemThreadGroup;
1523437531f515d84609fa43baaec32a0d1cc0e3fe0Brian CarlstromjfieldID WellKnownClasses::java_lang_Throwable_cause;
1533437531f515d84609fa43baaec32a0d1cc0e3fe0Brian CarlstromjfieldID WellKnownClasses::java_lang_Throwable_detailMessage;
1543437531f515d84609fa43baaec32a0d1cc0e3fe0Brian CarlstromjfieldID WellKnownClasses::java_lang_Throwable_stackTrace;
1553437531f515d84609fa43baaec32a0d1cc0e3fe0Brian CarlstromjfieldID WellKnownClasses::java_lang_Throwable_stackState;
1563437531f515d84609fa43baaec32a0d1cc0e3fe0Brian CarlstromjfieldID WellKnownClasses::java_lang_Throwable_suppressedExceptions;
157ea46f950e7a51585db293cd7f047de190a482414Brian CarlstromjfieldID WellKnownClasses::java_lang_reflect_AbstractMethod_artMethod;
158eac766769e3114a078c188ea26776a81f0edb3cfElliott HughesjfieldID WellKnownClasses::java_lang_reflect_Proxy_h;
159aecb5f3fd5dcd78bc3e74993acc40fed815b6b8bElliott HughesjfieldID WellKnownClasses::java_nio_DirectByteBuffer_capacity;
160aecb5f3fd5dcd78bc3e74993acc40fed815b6b8bElliott HughesjfieldID WellKnownClasses::java_nio_DirectByteBuffer_effectiveDirectAddress;
161e49e195c4bc2f20df0289c0bbb46f56839308ddeSebastien HertzjfieldID WellKnownClasses::java_util_ArrayList_array;
162e49e195c4bc2f20df0289c0bbb46f56839308ddeSebastien HertzjfieldID WellKnownClasses::java_util_ArrayList_size;
1633437531f515d84609fa43baaec32a0d1cc0e3fe0Brian CarlstromjfieldID WellKnownClasses::java_util_Collections_EMPTY_LIST;
1643437531f515d84609fa43baaec32a0d1cc0e3fe0Brian CarlstromjfieldID WellKnownClasses::libcore_util_EmptyArray_STACK_TRACE_ELEMENT;
165eac766769e3114a078c188ea26776a81f0edb3cfElliott HughesjfieldID WellKnownClasses::org_apache_harmony_dalvik_ddmc_Chunk_data;
166eac766769e3114a078c188ea26776a81f0edb3cfElliott HughesjfieldID WellKnownClasses::org_apache_harmony_dalvik_ddmc_Chunk_length;
167eac766769e3114a078c188ea26776a81f0edb3cfElliott HughesjfieldID WellKnownClasses::org_apache_harmony_dalvik_ddmc_Chunk_offset;
168eac766769e3114a078c188ea26776a81f0edb3cfElliott HughesjfieldID WellKnownClasses::org_apache_harmony_dalvik_ddmc_Chunk_type;
169eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
170eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughesstatic jclass CacheClass(JNIEnv* env, const char* jni_class_name) {
171eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  ScopedLocalRef<jclass> c(env, env->FindClass(jni_class_name));
1722cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  if (c.get() == nullptr) {
173eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes    LOG(FATAL) << "Couldn't find class: " << jni_class_name;
174eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  }
175eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  return reinterpret_cast<jclass>(env->NewGlobalRef(c.get()));
176eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes}
177eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
1783c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstromstatic jfieldID CacheField(JNIEnv* env, jclass c, bool is_static,
1793c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom                           const char* name, const char* signature) {
180e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  jfieldID fid = is_static ? env->GetStaticFieldID(c, name, signature) :
181e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier      env->GetFieldID(c, name, signature);
1822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  if (fid == nullptr) {
1833c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom    ScopedObjectAccess soa(env);
184e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    if (soa.Self()->IsExceptionPending()) {
185e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier      LOG(INTERNAL_FATAL) << soa.Self()->GetException()->Dump() << '\n';
186e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    }
1873c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom    std::ostringstream os;
1883c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom    WellKnownClasses::ToClass(c)->DumpClass(os, mirror::Class::kDumpClassFullDetail);
1893c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom    LOG(FATAL) << "Couldn't find field \"" << name << "\" with signature \"" << signature << "\": "
1903c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom               << os.str();
191eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  }
192eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  return fid;
193eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes}
194eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
1953c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian CarlstromjmethodID CacheMethod(JNIEnv* env, jclass c, bool is_static,
1963c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom                      const char* name, const char* signature) {
197e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  jmethodID mid = is_static ? env->GetStaticMethodID(c, name, signature) :
198e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier      env->GetMethodID(c, name, signature);
1992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  if (mid == nullptr) {
2003c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom    ScopedObjectAccess soa(env);
201e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    if (soa.Self()->IsExceptionPending()) {
202e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier      LOG(INTERNAL_FATAL) << soa.Self()->GetException()->Dump() << '\n';
203e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    }
2043c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom    std::ostringstream os;
2053c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom    WellKnownClasses::ToClass(c)->DumpClass(os, mirror::Class::kDumpClassFullDetail);
2063c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom    LOG(FATAL) << "Couldn't find method \"" << name << "\" with signature \"" << signature << "\": "
2073c821c67e28ee1ec7bea2b3b644f5aed303f19f3Brian Carlstrom               << os.str();
208eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  }
209eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  return mid;
210eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes}
211eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
21200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersstatic jmethodID CachePrimitiveBoxingMethod(JNIEnv* env, char prim_name, const char* boxed_name) {
21300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  ScopedLocalRef<jclass> boxed_class(env, env->FindClass(boxed_name));
21400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  return CacheMethod(env, boxed_class.get(), true, "valueOf",
21500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers                     StringPrintf("(%c)L%s;", prim_name, boxed_name).c_str());
21600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers}
21700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers
218ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromvoid WellKnownClasses::Init(JNIEnv* env) {
219eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  com_android_dex_Dex = CacheClass(env, "com/android/dex/Dex");
2206bcae8fa93684af581d16400f360541d39e5b5e6Mathieu Chartier  dalvik_system_DexFile = CacheClass(env, "dalvik/system/DexFile");
2216bcae8fa93684af581d16400f360541d39e5b5e6Mathieu Chartier  dalvik_system_DexPathList = CacheClass(env, "dalvik/system/DexPathList");
222c8ccf68b805c92674545f63e0341ba47e8d9701cAndreas Gampe  dalvik_system_DexPathList__Element = CacheClass(env, "dalvik/system/DexPathList$Element");
22300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  dalvik_system_PathClassLoader = CacheClass(env, "dalvik/system/PathClassLoader");
224b5de3bb65556950d5cce1dea3ea6d80adcc5051dMathieu Chartier  dalvik_system_VMRuntime = CacheClass(env, "dalvik/system/VMRuntime");
225b5de3bb65556950d5cce1dea3ea6d80adcc5051dMathieu Chartier
22613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  java_lang_annotation_Annotation__array = CacheClass(env, "[Ljava/lang/annotation/Annotation;");
2276bcae8fa93684af581d16400f360541d39e5b5e6Mathieu Chartier  java_lang_BootClassLoader = CacheClass(env, "java/lang/BootClassLoader");
228eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  java_lang_ClassLoader = CacheClass(env, "java/lang/ClassLoader");
229eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  java_lang_ClassNotFoundException = CacheClass(env, "java/lang/ClassNotFoundException");
230eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  java_lang_Daemons = CacheClass(env, "java/lang/Daemons");
231af6e67a4816d2593586115b89faa659225363246Ian Rogers  java_lang_Object = CacheClass(env, "java/lang/Object");
232a61894d88fabe45677f491c9f6bde30059a49026Mathieu Chartier  java_lang_OutOfMemoryError = CacheClass(env, "java/lang/OutOfMemoryError");
233eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  java_lang_Error = CacheClass(env, "java/lang/Error");
2347c8aa8357196781c811a73d2eb66aaaa1681ce36Jeff Hao  java_lang_ExceptionInInitializerError = CacheClass(env, "java/lang/ExceptionInInitializerError");
2357c8aa8357196781c811a73d2eb66aaaa1681ce36Jeff Hao  java_lang_IllegalAccessError = CacheClass(env, "java/lang/IllegalAccessError");
2367c8aa8357196781c811a73d2eb66aaaa1681ce36Jeff Hao  java_lang_NoClassDefFoundError = CacheClass(env, "java/lang/NoClassDefFoundError");
23766f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  java_lang_reflect_AbstractMethod = CacheClass(env, "java/lang/reflect/AbstractMethod");
238ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  java_lang_reflect_Constructor = CacheClass(env, "java/lang/reflect/Constructor");
239ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  java_lang_reflect_Field = CacheClass(env, "java/lang/reflect/Field");
240ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  java_lang_reflect_Method = CacheClass(env, "java/lang/reflect/Method");
241eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  java_lang_reflect_Proxy = CacheClass(env, "java/lang/reflect/Proxy");
242a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughes  java_lang_RuntimeException = CacheClass(env, "java/lang/RuntimeException");
243120f1c74a9768e958377b6c97897511b27ae58c8Ian Rogers  java_lang_StackOverflowError = CacheClass(env, "java/lang/StackOverflowError");
244dd157d732b557a854b3689faf8a24170fb47c270Ian Rogers  java_lang_String = CacheClass(env, "java/lang/String");
245848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory = CacheClass(env, "java/lang/StringFactory");
246987ccff48fe2c0645756e1089608e4b6b7e9f7bfMathieu Chartier  java_lang_System = CacheClass(env, "java/lang/System");
247eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  java_lang_Thread = CacheClass(env, "java/lang/Thread");
248c8ccf68b805c92674545f63e0341ba47e8d9701cAndreas Gampe  java_lang_Thread__UncaughtExceptionHandler = CacheClass(env,
249c8ccf68b805c92674545f63e0341ba47e8d9701cAndreas Gampe      "java/lang/Thread$UncaughtExceptionHandler");
250af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  java_lang_ThreadGroup = CacheClass(env, "java/lang/ThreadGroup");
251a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughes  java_lang_Throwable = CacheClass(env, "java/lang/Throwable");
252aecb5f3fd5dcd78bc3e74993acc40fed815b6b8bElliott Hughes  java_nio_DirectByteBuffer = CacheClass(env, "java/nio/DirectByteBuffer");
253e49e195c4bc2f20df0289c0bbb46f56839308ddeSebastien Hertz  java_util_ArrayList = CacheClass(env, "java/util/ArrayList");
2547ea6f79bbddd69d5db86a8656a31aaaf64ae2582Andreas Gampe  java_util_Collections = CacheClass(env, "java/util/Collections");
25513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  libcore_reflect_AnnotationFactory = CacheClass(env, "libcore/reflect/AnnotationFactory");
25613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  libcore_reflect_AnnotationMember = CacheClass(env, "libcore/reflect/AnnotationMember");
2577ea6f79bbddd69d5db86a8656a31aaaf64ae2582Andreas Gampe  libcore_util_EmptyArray = CacheClass(env, "libcore/util/EmptyArray");
258eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  org_apache_harmony_dalvik_ddmc_Chunk = CacheClass(env, "org/apache/harmony/dalvik/ddmc/Chunk");
259eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  org_apache_harmony_dalvik_ddmc_DdmServer = CacheClass(env, "org/apache/harmony/dalvik/ddmc/DdmServer");
260eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
261b5de3bb65556950d5cce1dea3ea6d80adcc5051dMathieu Chartier  dalvik_system_VMRuntime_runFinalization = CacheMethod(env, dalvik_system_VMRuntime, true, "runFinalization", "(J)V");
262eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  com_android_dex_Dex_create = CacheMethod(env, com_android_dex_Dex, true, "create", "(Ljava/nio/ByteBuffer;)Lcom/android/dex/Dex;");
263eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  java_lang_ClassNotFoundException_init = CacheMethod(env, java_lang_ClassNotFoundException, false, "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V");
264a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughes  java_lang_ClassLoader_loadClass = CacheMethod(env, java_lang_ClassLoader, false, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
2657664f5cd118b355a5fe0c7536cb48ac991ed2b62Mathieu Chartier
266eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  java_lang_Daemons_requestHeapTrim = CacheMethod(env, java_lang_Daemons, true, "requestHeapTrim", "()V");
267eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  java_lang_Daemons_start = CacheMethod(env, java_lang_Daemons, true, "start", "()V");
268cef50f0487929f72183623bc2a5819cf3a63bff6Mathieu Chartier  java_lang_Daemons_stop = CacheMethod(env, java_lang_Daemons, true, "stop", "()V");
269a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughes
270a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughes  ScopedLocalRef<jclass> java_lang_ref_FinalizerReference(env, env->FindClass("java/lang/ref/FinalizerReference"));
271a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughes  java_lang_ref_FinalizerReference_add = CacheMethod(env, java_lang_ref_FinalizerReference.get(), true, "add", "(Ljava/lang/Object;)V");
272a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughes  ScopedLocalRef<jclass> java_lang_ref_ReferenceQueue(env, env->FindClass("java/lang/ref/ReferenceQueue"));
273a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughes  java_lang_ref_ReferenceQueue_add = CacheMethod(env, java_lang_ref_ReferenceQueue.get(), true, "add", "(Ljava/lang/ref/Reference;)V");
274a4f94740f9d66b21f4bcd3a225c434aa29cfa323Elliott Hughes
275fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier  java_lang_reflect_Proxy_invoke = CacheMethod(env, java_lang_reflect_Proxy, true, "invoke", "(Ljava/lang/reflect/Proxy;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
276eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  java_lang_Thread_init = CacheMethod(env, java_lang_Thread, false, "<init>", "(Ljava/lang/ThreadGroup;Ljava/lang/String;IZ)V");
277af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  java_lang_Thread_run = CacheMethod(env, java_lang_Thread, false, "run", "()V");
278c8ccf68b805c92674545f63e0341ba47e8d9701cAndreas Gampe  java_lang_Thread__UncaughtExceptionHandler_uncaughtException = CacheMethod(env, java_lang_Thread__UncaughtExceptionHandler, false, "uncaughtException", "(Ljava/lang/Thread;Ljava/lang/Throwable;)V");
279e6cd3b53e54c4e5ea817561904e98397dd903a61Piotr Jastrzebski  java_lang_ThreadGroup_removeThread = CacheMethod(env, java_lang_ThreadGroup, false, "threadTerminated", "(Ljava/lang/Thread;)V");
280b56812165dd3a2e6eb8b85c810943b3d7bd9bfc4Elliott Hughes  java_nio_DirectByteBuffer_init = CacheMethod(env, java_nio_DirectByteBuffer, false, "<init>", "(JI)V");
28113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  libcore_reflect_AnnotationFactory_createAnnotation = CacheMethod(env, libcore_reflect_AnnotationFactory, true, "createAnnotation", "(Ljava/lang/Class;[Llibcore/reflect/AnnotationMember;)Ljava/lang/annotation/Annotation;");
28213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  libcore_reflect_AnnotationMember_init = CacheMethod(env, libcore_reflect_AnnotationMember, false, "<init>", "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/reflect/Method;)V");
283eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  org_apache_harmony_dalvik_ddmc_DdmServer_broadcast = CacheMethod(env, org_apache_harmony_dalvik_ddmc_DdmServer, true, "broadcast", "(I)V");
284eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  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;");
285eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
286848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init = CacheMethod(env, java_lang_String, false, "<init>", "()V");
287848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_B = CacheMethod(env, java_lang_String, false, "<init>", "([B)V");
288848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_BI = CacheMethod(env, java_lang_String, false, "<init>", "([BI)V");
289848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_BII = CacheMethod(env, java_lang_String, false, "<init>", "([BII)V");
290848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_BIII = CacheMethod(env, java_lang_String, false, "<init>", "([BIII)V");
291848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_BIIString = CacheMethod(env, java_lang_String, false, "<init>",
292848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao      "([BIILjava/lang/String;)V");
293848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_BString = CacheMethod(env, java_lang_String, false, "<init>",
294848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao      "([BLjava/lang/String;)V");
295848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_BIICharset = CacheMethod(env, java_lang_String, false, "<init>",
296848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao      "([BIILjava/nio/charset/Charset;)V");
297848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_BCharset = CacheMethod(env, java_lang_String, false, "<init>",
298848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao      "([BLjava/nio/charset/Charset;)V");
299848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_C = CacheMethod(env, java_lang_String, false, "<init>", "([C)V");
300848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_CII = CacheMethod(env, java_lang_String, false, "<init>", "([CII)V");
301848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_IIC = CacheMethod(env, java_lang_String, false, "<init>", "(II[C)V");
302848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_String = CacheMethod(env, java_lang_String, false, "<init>",
303848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao      "(Ljava/lang/String;)V");
304848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_StringBuffer = CacheMethod(env, java_lang_String, false, "<init>",
305848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao      "(Ljava/lang/StringBuffer;)V");
306848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_III = CacheMethod(env, java_lang_String, false, "<init>", "([III)V");
307848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_String_init_StringBuilder = CacheMethod(env, java_lang_String, false, "<init>",
308848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       "(Ljava/lang/StringBuilder;)V");
309848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newEmptyString = CacheMethod(env, java_lang_StringFactory, true,
310848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       "newEmptyString", "()Ljava/lang/String;");
311848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromBytes_B = CacheMethod(env, java_lang_StringFactory, true,
312848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       "newStringFromBytes", "([B)Ljava/lang/String;");
313848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromBytes_BI = CacheMethod(env, java_lang_StringFactory, true,
314848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       "newStringFromBytes", "([BI)Ljava/lang/String;");
315848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromBytes_BII = CacheMethod(env, java_lang_StringFactory, true,
316848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       "newStringFromBytes", "([BII)Ljava/lang/String;");
317848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromBytes_BIII = CacheMethod(env, java_lang_StringFactory, true,
318848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       "newStringFromBytes", "([BIII)Ljava/lang/String;");
319848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromBytes_BIIString = CacheMethod(env, java_lang_StringFactory,
320848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       true, "newStringFromBytes", "([BIILjava/lang/String;)Ljava/lang/String;");
321848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromBytes_BString = CacheMethod(env, java_lang_StringFactory,
322848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       true, "newStringFromBytes", "([BLjava/lang/String;)Ljava/lang/String;");
323848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromBytes_BIICharset = CacheMethod(env, java_lang_StringFactory,
324848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       true, "newStringFromBytes", "([BIILjava/nio/charset/Charset;)Ljava/lang/String;");
325848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromBytes_BCharset = CacheMethod(env, java_lang_StringFactory,
326848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       true, "newStringFromBytes", "([BLjava/nio/charset/Charset;)Ljava/lang/String;");
327848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromChars_C = CacheMethod(env, java_lang_StringFactory, true,
328848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       "newStringFromChars", "([C)Ljava/lang/String;");
329848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromChars_CII = CacheMethod(env, java_lang_StringFactory, true,
330848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       "newStringFromChars", "([CII)Ljava/lang/String;");
331848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromChars_IIC = CacheMethod(env, java_lang_StringFactory, true,
332848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       "newStringFromChars", "(II[C)Ljava/lang/String;");
333848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromString = CacheMethod(env, java_lang_StringFactory, true,
334848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       "newStringFromString", "(Ljava/lang/String;)Ljava/lang/String;");
335848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromStringBuffer = CacheMethod(env, java_lang_StringFactory,
336848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       true, "newStringFromStringBuffer", "(Ljava/lang/StringBuffer;)Ljava/lang/String;");
337848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromCodePoints = CacheMethod(env, java_lang_StringFactory,
338848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       true, "newStringFromCodePoints", "([III)Ljava/lang/String;");
339848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  java_lang_StringFactory_newStringFromStringBuilder = CacheMethod(env, java_lang_StringFactory,
340848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao       true, "newStringFromStringBuilder", "(Ljava/lang/StringBuilder;)Ljava/lang/String;");
341848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao
342324b9bb2f48be39e20077c1d7da45cf3dc47fe06Andreas Gampe  dalvik_system_DexFile_cookie = CacheField(env, dalvik_system_DexFile, false, "mCookie", "Ljava/lang/Object;");
343fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  dalvik_system_DexFile_fileName = CacheField(env, dalvik_system_DexFile, false, "mFileName", "Ljava/lang/String;");
3446bcae8fa93684af581d16400f360541d39e5b5e6Mathieu Chartier  dalvik_system_PathClassLoader_pathList = CacheField(env, dalvik_system_PathClassLoader, false, "pathList", "Ldalvik/system/DexPathList;");
3456bcae8fa93684af581d16400f360541d39e5b5e6Mathieu Chartier  dalvik_system_DexPathList_dexElements = CacheField(env, dalvik_system_DexPathList, false, "dexElements", "[Ldalvik/system/DexPathList$Element;");
346c8ccf68b805c92674545f63e0341ba47e8d9701cAndreas Gampe  dalvik_system_DexPathList__Element_dexFile = CacheField(env, dalvik_system_DexPathList__Element, false, "dexFile", "Ldalvik/system/DexFile;");
347af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  java_lang_Thread_daemon = CacheField(env, java_lang_Thread, false, "daemon", "Z");
348af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  java_lang_Thread_group = CacheField(env, java_lang_Thread, false, "group", "Ljava/lang/ThreadGroup;");
349c5dc2ff2d1beb3ff84f93d2c7ebe07c46b76956aElliott Hughes  java_lang_Thread_lock = CacheField(env, java_lang_Thread, false, "lock", "Ljava/lang/Object;");
350af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  java_lang_Thread_name = CacheField(env, java_lang_Thread, false, "name", "Ljava/lang/String;");
351af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  java_lang_Thread_priority = CacheField(env, java_lang_Thread, false, "priority", "I");
352e6cd3b53e54c4e5ea817561904e98397dd903a61Piotr Jastrzebski  java_lang_Thread_uncaughtHandler = CacheField(env, java_lang_Thread, false, "uncaughtExceptionHandler", "Ljava/lang/Thread$UncaughtExceptionHandler;");
353ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  java_lang_Thread_nativePeer = CacheField(env, java_lang_Thread, false, "nativePeer", "J");
354d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  java_lang_ThreadGroup_groups = CacheField(env, java_lang_ThreadGroup, false, "groups", "[Ljava/lang/ThreadGroup;");
355464595f53abe4370ee6f589eb472e2036e39bce7Przemyslaw Szczepaniak  java_lang_ThreadGroup_ngroups = CacheField(env, java_lang_ThreadGroup, false, "ngroups", "I");
356af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  java_lang_ThreadGroup_mainThreadGroup = CacheField(env, java_lang_ThreadGroup, true, "mainThreadGroup", "Ljava/lang/ThreadGroup;");
357af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  java_lang_ThreadGroup_name = CacheField(env, java_lang_ThreadGroup, false, "name", "Ljava/lang/String;");
358e49e195c4bc2f20df0289c0bbb46f56839308ddeSebastien Hertz  java_lang_ThreadGroup_parent = CacheField(env, java_lang_ThreadGroup, false, "parent", "Ljava/lang/ThreadGroup;");
359af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  java_lang_ThreadGroup_systemThreadGroup = CacheField(env, java_lang_ThreadGroup, true, "systemThreadGroup", "Ljava/lang/ThreadGroup;");
3603437531f515d84609fa43baaec32a0d1cc0e3fe0Brian Carlstrom  java_lang_Throwable_cause = CacheField(env, java_lang_Throwable, false, "cause", "Ljava/lang/Throwable;");
3613437531f515d84609fa43baaec32a0d1cc0e3fe0Brian Carlstrom  java_lang_Throwable_detailMessage = CacheField(env, java_lang_Throwable, false, "detailMessage", "Ljava/lang/String;");
3623437531f515d84609fa43baaec32a0d1cc0e3fe0Brian Carlstrom  java_lang_Throwable_stackTrace = CacheField(env, java_lang_Throwable, false, "stackTrace", "[Ljava/lang/StackTraceElement;");
363c16a50f4837d6204c0cf6c71129492cb4b86784dPiotr Jastrzebski  java_lang_Throwable_stackState = CacheField(env, java_lang_Throwable, false, "backtrace", "Ljava/lang/Object;");
3643437531f515d84609fa43baaec32a0d1cc0e3fe0Brian Carlstrom  java_lang_Throwable_suppressedExceptions = CacheField(env, java_lang_Throwable, false, "suppressedExceptions", "Ljava/util/List;");
365e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  java_lang_reflect_AbstractMethod_artMethod = CacheField(env, java_lang_reflect_AbstractMethod, false, "artMethod", "J");
366af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  java_lang_reflect_Proxy_h = CacheField(env, java_lang_reflect_Proxy, false, "h", "Ljava/lang/reflect/InvocationHandler;");
367aecb5f3fd5dcd78bc3e74993acc40fed815b6b8bElliott Hughes  java_nio_DirectByteBuffer_capacity = CacheField(env, java_nio_DirectByteBuffer, false, "capacity", "I");
3688c145b99fd47dca629b815ea7d76a17b7d50f742Piotr Jastrzebski  java_nio_DirectByteBuffer_effectiveDirectAddress = CacheField(env, java_nio_DirectByteBuffer, false, "address", "J");
369d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  java_util_ArrayList_array = CacheField(env, java_util_ArrayList, false, "elementData", "[Ljava/lang/Object;");
370e49e195c4bc2f20df0289c0bbb46f56839308ddeSebastien Hertz  java_util_ArrayList_size = CacheField(env, java_util_ArrayList, false, "size", "I");
3713437531f515d84609fa43baaec32a0d1cc0e3fe0Brian Carlstrom  java_util_Collections_EMPTY_LIST = CacheField(env, java_util_Collections, true, "EMPTY_LIST", "Ljava/util/List;");
3723437531f515d84609fa43baaec32a0d1cc0e3fe0Brian Carlstrom  libcore_util_EmptyArray_STACK_TRACE_ELEMENT = CacheField(env, libcore_util_EmptyArray, true, "STACK_TRACE_ELEMENT", "[Ljava/lang/StackTraceElement;");
373b30e0c644d1f15cf7f048ce733131e7ac70772aeSebastien Hertz  org_apache_harmony_dalvik_ddmc_Chunk_data = CacheField(env, org_apache_harmony_dalvik_ddmc_Chunk, false, "data", "[B");
374af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  org_apache_harmony_dalvik_ddmc_Chunk_length = CacheField(env, org_apache_harmony_dalvik_ddmc_Chunk, false, "length", "I");
375af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  org_apache_harmony_dalvik_ddmc_Chunk_offset = CacheField(env, org_apache_harmony_dalvik_ddmc_Chunk, false, "offset", "I");
376af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes  org_apache_harmony_dalvik_ddmc_Chunk_type = CacheField(env, org_apache_harmony_dalvik_ddmc_Chunk, false, "type", "I");
37700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers
37800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  java_lang_Boolean_valueOf = CachePrimitiveBoxingMethod(env, 'Z', "java/lang/Boolean");
37900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  java_lang_Byte_valueOf = CachePrimitiveBoxingMethod(env, 'B', "java/lang/Byte");
38000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  java_lang_Character_valueOf = CachePrimitiveBoxingMethod(env, 'C', "java/lang/Character");
38100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  java_lang_Double_valueOf = CachePrimitiveBoxingMethod(env, 'D', "java/lang/Double");
38200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  java_lang_Float_valueOf = CachePrimitiveBoxingMethod(env, 'F', "java/lang/Float");
38300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  java_lang_Integer_valueOf = CachePrimitiveBoxingMethod(env, 'I', "java/lang/Integer");
38400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  java_lang_Long_valueOf = CachePrimitiveBoxingMethod(env, 'J', "java/lang/Long");
38500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  java_lang_Short_valueOf = CachePrimitiveBoxingMethod(env, 'S', "java/lang/Short");
386848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao
387848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  Thread::Current()->InitStringEntryPoints();
388af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes}
389af8d15a3267343dec135cc6df1db740c0a5c7b52Elliott Hughes
390ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogersvoid WellKnownClasses::LateInit(JNIEnv* env) {
391ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers  ScopedLocalRef<jclass> java_lang_Runtime(env, env->FindClass("java/lang/Runtime"));
39244409d33e05cd2f73d69e0a98daa5c9e2fe38089Dmitriy Ivanov  java_lang_Runtime_nativeLoad =
39344409d33e05cd2f73d69e0a98daa5c9e2fe38089Dmitriy Ivanov      CacheMethod(env, java_lang_Runtime.get(), true, "nativeLoad",
394c286a7fcd8a446c086127bf03fd07f904e017336Dimitry Ivanov                  "(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;)"
39544409d33e05cd2f73d69e0a98daa5c9e2fe38089Dmitriy Ivanov                      "Ljava/lang/String;");
396ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers}
397ef28b14268ed0f9db0c7bbd571aa514354a360bdIan Rogers
3982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersmirror::Class* WellKnownClasses::ToClass(jclass global_jclass) {
3992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return reinterpret_cast<mirror::Class*>(Thread::Current()->DecodeJObject(global_jclass));
400eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes}
401eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes
402848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaojmethodID WellKnownClasses::StringInitToStringFactoryMethodID(jmethodID string_init) {
403848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  // TODO: Prioritize ordering.
404848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  if (string_init == java_lang_String_init) {
405848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newEmptyString;
406848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_B) {
407848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromBytes_B;
408848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_BI) {
409848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromBytes_BI;
410848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_BII) {
411848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromBytes_BII;
412848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_BIII) {
413848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromBytes_BIII;
414848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_BIIString) {
415848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromBytes_BIIString;
416848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_BString) {
417848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromBytes_BString;
418848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_BIICharset) {
419848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromBytes_BIICharset;
420848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_BCharset) {
421848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromBytes_BCharset;
422848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_C) {
423848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromChars_C;
424848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_CII) {
425848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromChars_CII;
426848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_IIC) {
427848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromChars_IIC;
428848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_String) {
429848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromString;
430848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_StringBuffer) {
431848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromStringBuffer;
432848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_III) {
433848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromCodePoints;
434848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  } else if (string_init == java_lang_String_init_StringBuilder) {
435848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    return java_lang_StringFactory_newStringFromStringBuilder;
436848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  }
437848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  LOG(FATAL) << "Could not find StringFactory method for String.<init>";
438848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao  return nullptr;
439848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao}
440848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao
441eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes}  // namespace art
442