Finish cleanup of class/field/method caching.

Change-Id: I289ae724cbd98487429275837d23b7b2d7096156
diff --git a/src/class_linker.cc b/src/class_linker.cc
index c1382e2..43f1b42 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -135,25 +135,20 @@
 }
 
 static void WrapExceptionInInitializer() {
-  JNIEnv* env = Thread::Current()->GetJniEnv();
+  Thread* self = Thread::Current();
+  JNIEnv* env = self->GetJniEnv();
 
   ScopedLocalRef<jthrowable> cause(env, env->ExceptionOccurred());
   CHECK(cause.get() != NULL);
 
   env->ExceptionClear();
+  bool is_error = env->IsInstanceOf(cause.get(), WellKnownClasses::java_lang_Error);
+  env->Throw(cause.get());
 
-  if (env->IsInstanceOf(cause.get(), WellKnownClasses::java_lang_Error)) {
-    // We only wrap non-Error exceptions; an Error can just be used as-is.
-    env->Throw(cause.get());
-    return;
+  // We only wrap non-Error exceptions; an Error can just be used as-is.
+  if (!is_error) {
+    self->ThrowNewWrappedException("Ljava/lang/ExceptionInInitializerError;", NULL);
   }
-
-  jmethodID mid = env->GetMethodID(WellKnownClasses::java_lang_ExceptionInInitializerError, "<init>" , "(Ljava/lang/Throwable;)V");
-  CHECK(mid != NULL);
-
-  ScopedLocalRef<jthrowable> eiie(env,
-      reinterpret_cast<jthrowable>(env->NewObject(WellKnownClasses::java_lang_ExceptionInInitializerError, mid, cause.get())));
-  env->Throw(eiie.get());
 }
 
 static size_t Hash(const char* s) {
@@ -477,9 +472,6 @@
   Class* java_lang_ref_ReferenceQueue = FindSystemClass("Ljava/lang/ref/ReferenceQueue;");
   Class* java_lang_ref_FinalizerReference = FindSystemClass("Ljava/lang/ref/FinalizerReference;");
 
-  Heap* heap = Runtime::Current()->GetHeap();
-  heap->SetWellKnownClasses(java_lang_ref_FinalizerReference, java_lang_ref_ReferenceQueue);
-
   const DexFile& java_lang_dex = FindDexFile(java_lang_ref_Reference->GetDexCache());
 
   Field* pendingNext = java_lang_ref_Reference->GetInstanceField(0);
@@ -512,6 +504,7 @@
   CHECK_EQ(java_lang_dex.GetFieldId(zombie->GetDexFieldIndex()).type_idx_,
            GetClassRoot(kJavaLangObject)->GetDexTypeIndex());
 
+  Heap* heap = Runtime::Current()->GetHeap();
   heap->SetReferenceOffsets(referent->GetOffset(),
                             queue->GetOffset(),
                             queueNext->GetOffset(),
@@ -1139,18 +1132,14 @@
     std::string class_name_string(DescriptorToDot(descriptor));
     ScopedThreadStateChange tsc(self, kNative);
     JNIEnv* env = self->GetJniEnv();
-    ScopedLocalRef<jclass> c(env, AddLocalReference<jclass>(env, GetClassRoot(kJavaLangClassLoader)));
-    CHECK(c.get() != NULL);
-    // TODO: cache method?
-    jmethodID mid = env->GetMethodID(c.get(), "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
-    CHECK(mid != NULL);
     ScopedLocalRef<jobject> class_name_object(env, env->NewStringUTF(class_name_string.c_str()));
     if (class_name_object.get() == NULL) {
       return NULL;
     }
     ScopedLocalRef<jobject> class_loader_object(env, AddLocalReference<jobject>(env, class_loader));
     CHECK(class_loader_object.get() != NULL);
-    ScopedLocalRef<jobject> result(env, env->CallObjectMethod(class_loader_object.get(), mid,
+    ScopedLocalRef<jobject> result(env, env->CallObjectMethod(class_loader_object.get(),
+                                                              WellKnownClasses::java_lang_ClassLoader_loadClass,
                                                               class_name_object.get()));
     if (env->ExceptionCheck()) {
       // If the ClassLoader threw, pass that exception up.