Improve debug-ability of native method registration
If we fail to register a native we construct a stack trace which needs
Throwable and stack trace support. Registering Throwable's natives first
and making Throwable a root supports this. Previously we could only
generate a stack trace when thread start up was complete.
Change-Id: Icc7c1657988c7f36aceb1d4f3e61e7218f55e055
diff --git a/src/class_linker.cc b/src/class_linker.cc
index 6f1e5aa..cf0c094 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -186,6 +186,7 @@
"Ljava/lang/ClassLoader;",
"Ldalvik/system/BaseDexClassLoader;",
"Ldalvik/system/PathClassLoader;",
+ "Ljava/lang/Throwable;",
"Ljava/lang/StackTraceElement;",
"Z",
"B",
@@ -470,7 +471,9 @@
SetClassRoot(kDalvikSystemPathClassLoader, dalvik_system_PathClassLoader);
PathClassLoader::SetClass(dalvik_system_PathClassLoader);
- // Set up java.lang.StackTraceElement as a convenience
+ // Set up java.lang.Throwable and java.lang.StackTraceElement as a convenience
+ SetClassRoot(kJavaLangThrowable, FindSystemClass("Ljava/lang/Throwable;"));
+ Throwable::SetClass(GetClassRoot(kJavaLangThrowable));
SetClassRoot(kJavaLangStackTraceElement, FindSystemClass("Ljava/lang/StackTraceElement;"));
SetClassRoot(kJavaLangStackTraceElementArrayClass, FindSystemClass("[Ljava/lang/StackTraceElement;"));
StackTraceElement::SetClass(GetClassRoot(kJavaLangStackTraceElement));
@@ -933,6 +936,7 @@
LongArray::SetArrayClass(GetClassRoot(kLongArrayClass));
ShortArray::SetArrayClass(GetClassRoot(kShortArrayClass));
PathClassLoader::SetClass(GetClassRoot(kDalvikSystemPathClassLoader));
+ Throwable::SetClass(GetClassRoot(kJavaLangThrowable));
StackTraceElement::SetClass(GetClassRoot(kJavaLangStackTraceElement));
FinishInit();
@@ -1009,6 +1013,7 @@
LongArray::ResetArrayClass();
ShortArray::ResetArrayClass();
PathClassLoader::ResetClass();
+ Throwable::ResetClass();
StackTraceElement::ResetClass();
STLDeleteElements(&boot_class_path_);
STLDeleteElements(&oat_files_);