Various runtime/JNI related fixes.

NewObject returns NULL if exception is thrown in constructor.
Allocate the peer then call constructor to ensure peer_ field is
initialized.
Change thread state for AddFinalizer and pass current thread through for
ease.

Change-Id: Ib578b6d44b08aef10fde5d8bc27cc6a2acbf6fae
diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index 5052773..1f3124c 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -965,7 +965,11 @@
     }
     jobject local_result = AddLocalReference<jobject>(env, result);
     CallNonvirtualVoidMethodV(env, local_result, java_class, mid, args);
-    return local_result;
+    if (!ts.Self()->IsExceptionPending()) {
+      return local_result;
+    } else {
+      return NULL;
+    }
   }
 
   static jobject NewObjectA(JNIEnv* env, jclass java_class, jmethodID mid, jvalue* args) {
@@ -980,7 +984,11 @@
     }
     jobject local_result = AddLocalReference<jobjectArray>(env, result);
     CallNonvirtualVoidMethodA(env, local_result, java_class, mid, args);
-    return local_result;
+    if (!ts.Self()->IsExceptionPending()) {
+      return local_result;
+    } else {
+      return NULL;
+    }
   }
 
   static jmethodID GetMethodID(JNIEnv* env, jclass c, const char* name, const char* sig) {