1 // Copyright 2014 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/android/jni_weak_ref.h"
9 #include "base/android/jni_android.h"
11 using base::android::AttachCurrentThread;
13 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef() : obj_(nullptr) {}
15 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
16 const JavaObjectWeakGlobalRef& orig)
21 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
22 JavaObjectWeakGlobalRef&& orig) noexcept
27 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj)
28 : obj_(env->NewWeakGlobalRef(obj)) {
31 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
33 const base::android::JavaRef<jobject>& obj)
34 : obj_(env->NewWeakGlobalRef(obj.obj())) {
37 JavaObjectWeakGlobalRef::~JavaObjectWeakGlobalRef() {
41 void JavaObjectWeakGlobalRef::operator=(const JavaObjectWeakGlobalRef& rhs) {
45 void JavaObjectWeakGlobalRef::operator=(JavaObjectWeakGlobalRef&& rhs) {
46 std::swap(obj_, rhs.obj_);
49 void JavaObjectWeakGlobalRef::reset() {
51 AttachCurrentThread()->DeleteWeakGlobalRef(obj_);
56 base::android::ScopedJavaLocalRef<jobject>
57 JavaObjectWeakGlobalRef::get(JNIEnv* env) const {
58 return GetRealObject(env, obj_);
61 base::android::ScopedJavaLocalRef<jobject> GetRealObject(
62 JNIEnv* env, jweak obj) {
63 jobject real = nullptr;
65 real = env->NewLocalRef(obj);
66 return base::android::ScopedJavaLocalRef<jobject>(env, real);
69 void JavaObjectWeakGlobalRef::Assign(const JavaObjectWeakGlobalRef& other) {
73 JNIEnv* env = AttachCurrentThread();
75 env->DeleteWeakGlobalRef(obj_);
77 obj_ = other.obj_ ? env->NewWeakGlobalRef(other.obj_) : nullptr;