xref: /aosp_15_r20/external/libchrome/base/android/jni_weak_ref.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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 Worker JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef() : obj_(nullptr) {}
15*635a8641SAndroid Build Coastguard Worker 
JavaObjectWeakGlobalRef(const JavaObjectWeakGlobalRef & orig)16*635a8641SAndroid Build Coastguard Worker JavaObjectWeakGlobalRef::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 Worker JavaObjectWeakGlobalRef::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 Worker JavaObjectWeakGlobalRef::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 Worker JavaObjectWeakGlobalRef::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 Worker JavaObjectWeakGlobalRef::~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 Worker void 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 Worker void 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 Worker void 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 Worker base::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 Worker void 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