Don't set the context class loader until it has been created.
We had a bug where we were setting the main thread's context
class loader to null because we hadn't created it yet. This
moves the setting of the context class loader to after it has
been created.
Change-Id: Ib4be1be646ade4c426dda3ced30ae1ba37ddd0f6
diff --git a/src/runtime.cc b/src/runtime.cc
index d5b9562..656fdb8 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -425,6 +425,15 @@
CHECK(class_loader.get() != NULL);
Thread::Current()->SetClassLoaderOverride(Decode<ClassLoader*>(env, class_loader.get()));
+
+ ScopedLocalRef<jclass> Thread_class(env, env->FindClass("java/lang/Thread"));
+ CHECK(Thread_class.get() != NULL);
+ jfieldID contextClassLoader = env->GetFieldID(Thread_class.get(),
+ "contextClassLoader",
+ "Ljava/lang/ClassLoader;");
+ CHECK(contextClassLoader != NULL);
+ ScopedLocalRef<jobject> self_jobject(env, AddLocalReference<jobject>(env, self->GetPeer()));
+ env->SetObjectField(self_jobject.get(), contextClassLoader, class_loader.get());
}
void Runtime::Start() {
diff --git a/src/thread.cc b/src/thread.cc
index c5f9095..8dc81c2 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -733,8 +733,6 @@
// Finish attaching the main thread.
Thread::Current()->CreatePeer("main", false);
- const Field* Thread_contextClassLoader = FindFieldOrDie(Thread_class , "contextClassLoader", "Ljava/lang/ClassLoader;");
- Thread_contextClassLoader->SetObject(self->GetPeer(), self->GetClassLoaderOverride());
InitBoxingMethods();
class_linker->RunRootClinits();