Various things.

This patch:

1. adds good-enough implementations for a couple of Class native methods we
need.

2. removes a fixed TODO from image_test.

3. adds missing null checks to the Thread native methods, and forwards
Thread.nativeCreate to Thread::Create.

4. stops jni_compiler from overwriting already-registered native methods
with the dynamic lookup stub.

5. adds workarounds to Thread::CreatePeer so we can cope better without
code, attempts to initialize thread groups correctly, dumps thread state
from the managed peer (where one exists), and implements Thread::DumpStack
for debugging (and SIGQUIT dumps).

Change-Id: I3281226dd22ec852dca5165748fc75a254904ac0
diff --git a/src/java_lang_Thread.cc b/src/java_lang_Thread.cc
index 44578ee..286a211 100644
--- a/src/java_lang_Thread.cc
+++ b/src/java_lang_Thread.cc
@@ -26,8 +26,7 @@
 namespace {
 
 jobject Thread_currentThread(JNIEnv* env, jclass) {
-  Object* peer = Decode<Object*>(env, Thread::Current()->GetPeer());
-  return AddLocalReference<jobject>(env, peer);
+  return AddLocalReference<jobject>(env, Thread::Current()->GetPeer());
 }
 
 jboolean Thread_interrupted(JNIEnv* env, jclass) {
@@ -37,19 +36,19 @@
 jboolean Thread_isInterrupted(JNIEnv* env, jobject javaThread) {
   ThreadListLock lock;
   Thread* thread = Thread::FromManagedThread(env, javaThread);
-  return thread->IsInterrupted();
+  return (thread != NULL) ? thread->IsInterrupted() : JNI_FALSE;
 }
 
 void Thread_nativeCreate(JNIEnv* env, jclass, jobject javaThread, jlong stackSize) {
-  UNIMPLEMENTED(FATAL);
-  //Object* threadObj = dvmDecodeIndirectRef(env, javaThread);
-  //dvmCreateInterpThread(threadObj, (int) stackSize);
+  Object* managedThread = Decode<Object*>(env, javaThread);
+  Thread::Create(managedThread, stackSize);
 }
 
 jint Thread_nativeGetStatus(JNIEnv* env, jobject javaThread) {
   ThreadListLock lock;
   Thread* thread = Thread::FromManagedThread(env, javaThread);
-  return static_cast<jint>(thread->GetState());
+  Thread::State state = (thread != NULL) ? thread->GetState() : Thread::kUnknown;
+  return static_cast<jint>(state);
 }
 
 jboolean Thread_nativeHoldsLock(JNIEnv* env, jobject javaThread, jobject javaObject) {
@@ -93,7 +92,9 @@
 void Thread_nativeSetPriority(JNIEnv* env, jobject javaThread, jint newPriority) {
   ThreadListLock lock;
   Thread* thread = Thread::FromManagedThread(env, javaThread);
-  thread->SetNativePriority(newPriority);
+  if (thread != NULL) {
+    thread->SetNativePriority(newPriority);
+  }
 }
 
 /*