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