xref: /aosp_15_r20/external/cronet/base/android/jni_weak_ref.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 Worker JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef() : obj_(nullptr) {}
14*6777b538SAndroid Build Coastguard Worker 
JavaObjectWeakGlobalRef(const JavaObjectWeakGlobalRef & orig)15*6777b538SAndroid Build Coastguard Worker JavaObjectWeakGlobalRef::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 Worker JavaObjectWeakGlobalRef::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 Worker JavaObjectWeakGlobalRef::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 Worker JavaObjectWeakGlobalRef::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 Worker JavaObjectWeakGlobalRef::~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 Worker void 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 Worker void 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 Worker void 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 Worker base::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 Worker void 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