diff options
| -rw-r--r-- | runtime/jni_internal.cc | 19 | ||||
| -rw-r--r-- | runtime/thread.cc | 2 |
2 files changed, 12 insertions, 9 deletions
diff --git a/runtime/jni_internal.cc b/runtime/jni_internal.cc index 6690519eba..bbe5fda62f 100644 --- a/runtime/jni_internal.cc +++ b/runtime/jni_internal.cc @@ -844,13 +844,14 @@ class JNI { } static jobject NewGlobalRef(JNIEnv* env, jobject obj) { - if (obj == NULL) { - return NULL; - } ScopedObjectAccess soa(env); + Object* decoded_obj = soa.Decode<Object*>(obj); + // Check for null after decoding the object to handle cleared weak globals. + if (decoded_obj == nullptr) { + return nullptr; + } JavaVMExt* vm = soa.Vm(); IndirectReferenceTable& globals = vm->globals; - Object* decoded_obj = soa.Decode<Object*>(obj); WriterMutexLock mu(soa.Self(), vm->globals_lock); IndirectRef ref = globals.Add(IRT_FIRST_SEGMENT, decoded_obj); return reinterpret_cast<jobject>(ref); @@ -884,11 +885,13 @@ class JNI { } static jobject NewLocalRef(JNIEnv* env, jobject obj) { - if (obj == NULL) { - return NULL; - } ScopedObjectAccess soa(env); - return soa.AddLocalReference<jobject>(soa.Decode<Object*>(obj)); + mirror::Object* decoded_obj = soa.Decode<Object*>(obj); + // Check for null after decoding the object to handle cleared weak globals. + if (decoded_obj == nullptr) { + return nullptr; + } + return soa.AddLocalReference<jobject>(decoded_obj); } static void DeleteLocalRef(JNIEnv* env, jobject obj) { diff --git a/runtime/thread.cc b/runtime/thread.cc index bc252deecc..9faa60dbf8 100644 --- a/runtime/thread.cc +++ b/runtime/thread.cc @@ -1147,7 +1147,7 @@ mirror::Object* Thread::DecodeJObject(jobject obj) const { result = Runtime::Current()->GetJavaVM()->DecodeWeakGlobal(const_cast<Thread*>(this), ref); if (result == kClearedJniWeakGlobal) { // This is a special case where it's okay to return NULL. - return NULL; + return nullptr; } } |