1 // Copyright 2013 The Flutter Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "flutter/fml/platform/android/jni_weak_ref.h" 6 7 #include "flutter/fml/logging.h" 8 #include "flutter/fml/platform/android/jni_util.h" 9 10 namespace fml { 11 namespace jni { 12 JavaObjectWeakGlobalRef()13JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef() : obj_(NULL) {} 14 JavaObjectWeakGlobalRef(const JavaObjectWeakGlobalRef & orig)15JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef( 16 const JavaObjectWeakGlobalRef& orig) 17 : obj_(NULL) { 18 Assign(orig); 19 } 20 JavaObjectWeakGlobalRef(JNIEnv * env,jobject obj)21JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj) 22 : obj_(env->NewWeakGlobalRef(obj)) { 23 FML_DCHECK(obj_); 24 } 25 ~JavaObjectWeakGlobalRef()26JavaObjectWeakGlobalRef::~JavaObjectWeakGlobalRef() { 27 reset(); 28 } 29 operator =(const JavaObjectWeakGlobalRef & rhs)30void JavaObjectWeakGlobalRef::operator=(const JavaObjectWeakGlobalRef& rhs) { 31 Assign(rhs); 32 } 33 reset()34void JavaObjectWeakGlobalRef::reset() { 35 if (obj_) { 36 AttachCurrentThread()->DeleteWeakGlobalRef(obj_); 37 obj_ = NULL; 38 } 39 } 40 get(JNIEnv * env) const41ScopedJavaLocalRef<jobject> JavaObjectWeakGlobalRef::get(JNIEnv* env) const { 42 return GetRealObject(env, obj_); 43 } 44 GetRealObject(JNIEnv * env,jweak obj)45ScopedJavaLocalRef<jobject> GetRealObject(JNIEnv* env, jweak obj) { 46 jobject real = NULL; 47 if (obj) { 48 real = env->NewLocalRef(obj); 49 if (!real) { 50 FML_DLOG(ERROR) << "The real object has been deleted!"; 51 } 52 } 53 return ScopedJavaLocalRef<jobject>(env, real); 54 } 55 Assign(const JavaObjectWeakGlobalRef & other)56void JavaObjectWeakGlobalRef::Assign(const JavaObjectWeakGlobalRef& other) { 57 if (&other == this) 58 return; 59 60 JNIEnv* env = AttachCurrentThread(); 61 if (obj_) 62 env->DeleteWeakGlobalRef(obj_); 63 64 obj_ = other.obj_ ? env->NewWeakGlobalRef(other.obj_) : NULL; 65 } 66 67 } // namespace jni 68 } // namespace fml 69