1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_weak_ref.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include <utility> 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_android.h" 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker using base::android::AttachCurrentThread; 12*6777b538SAndroid Build Coastguard Worker JavaObjectWeakGlobalRef()13*6777b538SAndroid Build Coastguard WorkerJavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef() : obj_(nullptr) {} 14*6777b538SAndroid Build Coastguard Worker JavaObjectWeakGlobalRef(const JavaObjectWeakGlobalRef & orig)15*6777b538SAndroid Build Coastguard WorkerJavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef( 16*6777b538SAndroid Build Coastguard Worker const JavaObjectWeakGlobalRef& orig) 17*6777b538SAndroid Build Coastguard Worker : obj_(nullptr) { 18*6777b538SAndroid Build Coastguard Worker Assign(orig); 19*6777b538SAndroid Build Coastguard Worker } 20*6777b538SAndroid Build Coastguard Worker JavaObjectWeakGlobalRef(JavaObjectWeakGlobalRef && orig)21*6777b538SAndroid Build Coastguard WorkerJavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef( 22*6777b538SAndroid Build Coastguard Worker JavaObjectWeakGlobalRef&& orig) noexcept 23*6777b538SAndroid Build Coastguard Worker : obj_(orig.obj_) { 24*6777b538SAndroid Build Coastguard Worker orig.obj_ = nullptr; 25*6777b538SAndroid Build Coastguard Worker } 26*6777b538SAndroid Build Coastguard Worker JavaObjectWeakGlobalRef(JNIEnv * env,jobject obj)27*6777b538SAndroid Build Coastguard WorkerJavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj) 28*6777b538SAndroid Build Coastguard Worker : obj_(env->NewWeakGlobalRef(obj)) { 29*6777b538SAndroid Build Coastguard Worker } 30*6777b538SAndroid Build Coastguard Worker JavaObjectWeakGlobalRef(JNIEnv * env,const base::android::JavaRef<jobject> & obj)31*6777b538SAndroid Build Coastguard WorkerJavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef( 32*6777b538SAndroid Build Coastguard Worker JNIEnv* env, 33*6777b538SAndroid Build Coastguard Worker const base::android::JavaRef<jobject>& obj) 34*6777b538SAndroid Build Coastguard Worker : obj_(env->NewWeakGlobalRef(obj.obj())) { 35*6777b538SAndroid Build Coastguard Worker } 36*6777b538SAndroid Build Coastguard Worker ~JavaObjectWeakGlobalRef()37*6777b538SAndroid Build Coastguard WorkerJavaObjectWeakGlobalRef::~JavaObjectWeakGlobalRef() { 38*6777b538SAndroid Build Coastguard Worker reset(); 39*6777b538SAndroid Build Coastguard Worker } 40*6777b538SAndroid Build Coastguard Worker operator =(const JavaObjectWeakGlobalRef & rhs)41*6777b538SAndroid Build Coastguard Workervoid JavaObjectWeakGlobalRef::operator=(const JavaObjectWeakGlobalRef& rhs) { 42*6777b538SAndroid Build Coastguard Worker Assign(rhs); 43*6777b538SAndroid Build Coastguard Worker } 44*6777b538SAndroid Build Coastguard Worker operator =(JavaObjectWeakGlobalRef && rhs)45*6777b538SAndroid Build Coastguard Workervoid JavaObjectWeakGlobalRef::operator=(JavaObjectWeakGlobalRef&& rhs) { 46*6777b538SAndroid Build Coastguard Worker std::swap(obj_, rhs.obj_); 47*6777b538SAndroid Build Coastguard Worker } 48*6777b538SAndroid Build Coastguard Worker reset()49*6777b538SAndroid Build Coastguard Workervoid JavaObjectWeakGlobalRef::reset() { 50*6777b538SAndroid Build Coastguard Worker if (obj_) { 51*6777b538SAndroid Build Coastguard Worker AttachCurrentThread()->DeleteWeakGlobalRef(obj_); 52*6777b538SAndroid Build Coastguard Worker obj_ = nullptr; 53*6777b538SAndroid Build Coastguard Worker } 54*6777b538SAndroid Build Coastguard Worker } 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker base::android::ScopedJavaLocalRef<jobject> get(JNIEnv * env) const57*6777b538SAndroid Build Coastguard Worker JavaObjectWeakGlobalRef::get(JNIEnv* env) const { 58*6777b538SAndroid Build Coastguard Worker return GetRealObject(env, obj_); 59*6777b538SAndroid Build Coastguard Worker } 60*6777b538SAndroid Build Coastguard Worker GetRealObject(JNIEnv * env,jweak obj)61*6777b538SAndroid Build Coastguard Workerbase::android::ScopedJavaLocalRef<jobject> GetRealObject( 62*6777b538SAndroid Build Coastguard Worker JNIEnv* env, jweak obj) { 63*6777b538SAndroid Build Coastguard Worker jobject real = nullptr; 64*6777b538SAndroid Build Coastguard Worker if (obj) 65*6777b538SAndroid Build Coastguard Worker real = env->NewLocalRef(obj); 66*6777b538SAndroid Build Coastguard Worker return base::android::ScopedJavaLocalRef<jobject>(env, real); 67*6777b538SAndroid Build Coastguard Worker } 68*6777b538SAndroid Build Coastguard Worker Assign(const JavaObjectWeakGlobalRef & other)69*6777b538SAndroid Build Coastguard Workervoid JavaObjectWeakGlobalRef::Assign(const JavaObjectWeakGlobalRef& other) { 70*6777b538SAndroid Build Coastguard Worker if (&other == this) 71*6777b538SAndroid Build Coastguard Worker return; 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker JNIEnv* env = AttachCurrentThread(); 74*6777b538SAndroid Build Coastguard Worker if (obj_) 75*6777b538SAndroid Build Coastguard Worker env->DeleteWeakGlobalRef(obj_); 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker obj_ = other.obj_ ? env->NewWeakGlobalRef(other.obj_) : nullptr; 78*6777b538SAndroid Build Coastguard Worker } 79