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) {