Increase use of ScopedJniThreadState.

Move the routines for changing Object* to jobject and vice-versa
(AddLocalReference and Decode) to ScopedJniThreadState to enforce use of
Object*s in the Runnable thread state. In the Runnable thread state
suspension is necessary before GC can take place.

Reduce use of const ClassLoader* as the code bottoms out in FindClass
and with a field assignment where the const is cast away (ie if we're
not going to enforce the const-ness we shouldn't pretend it is).

Refactor the Thread::Attach API so that we're not handling raw Objects on
unattached threads.

Remove some unreachable code.

Change-Id: I0fa969f49ee6a8f10752af74a6b0e04d46b4cd97
diff --git a/src/native/java_lang_Object.cc b/src/native/java_lang_Object.cc
index 51e4581..d6b1bd6 100644
--- a/src/native/java_lang_Object.cc
+++ b/src/native/java_lang_Object.cc
@@ -16,27 +16,31 @@
 
 #include "jni_internal.h"
 #include "object.h"
+#include "scoped_jni_thread_state.h"
 
 namespace art {
 
 static jobject Object_internalClone(JNIEnv* env, jobject javaThis) {
-  ScopedThreadStateChange tsc(Thread::Current(), kRunnable);
-  Object* o = Decode<Object*>(env, javaThis);
-  return AddLocalReference<jobject>(env, o->Clone());
+  ScopedJniThreadState ts(env);
+  Object* o = ts.Decode<Object*>(javaThis);
+  return ts.AddLocalReference<jobject>(o->Clone());
 }
 
 static void Object_notify(JNIEnv* env, jobject javaThis) {
-  Object* o = Decode<Object*>(env, javaThis);
+  ScopedJniThreadState ts(env);
+  Object* o = ts.Decode<Object*>(javaThis);
   o->Notify();
 }
 
 static void Object_notifyAll(JNIEnv* env, jobject javaThis) {
-  Object* o = Decode<Object*>(env, javaThis);
+  ScopedJniThreadState ts(env);
+  Object* o = ts.Decode<Object*>(javaThis);
   o->NotifyAll();
 }
 
 static void Object_wait(JNIEnv* env, jobject javaThis, jlong ms, jint ns) {
-  Object* o = Decode<Object*>(env, javaThis);
+  ScopedJniThreadState ts(env);
+  Object* o = ts.Decode<Object*>(javaThis);
   o->Wait(ms, ns);
 }