1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2014 The Chromium Authors. All rights reserved. 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file. 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/jni_weak_ref.h" 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/jni_android.h" 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/logging.h" 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezusing base::android::AttachCurrentThread; 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezJavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef() 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez : obj_(NULL) { 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezJavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef( 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const JavaObjectWeakGlobalRef& orig) 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez : obj_(NULL) { 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Assign(orig); 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezJavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj) 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez : obj_(env->NewWeakGlobalRef(obj)) { 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez DCHECK(obj_); 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezJavaObjectWeakGlobalRef::~JavaObjectWeakGlobalRef() { 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez reset(); 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezvoid JavaObjectWeakGlobalRef::operator=(const JavaObjectWeakGlobalRef& rhs) { 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Assign(rhs); 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezvoid JavaObjectWeakGlobalRef::reset() { 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (obj_) { 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez AttachCurrentThread()->DeleteWeakGlobalRef(obj_); 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez obj_ = NULL; 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbase::android::ScopedJavaLocalRef<jobject> 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez JavaObjectWeakGlobalRef::get(JNIEnv* env) const { 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return GetRealObject(env, obj_); 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbase::android::ScopedJavaLocalRef<jobject> GetRealObject( 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez JNIEnv* env, jweak obj) { 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez jobject real = NULL; 50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (obj) 51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez real = env->NewLocalRef(obj); 52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return base::android::ScopedJavaLocalRef<jobject>(env, real); 53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezvoid JavaObjectWeakGlobalRef::Assign(const JavaObjectWeakGlobalRef& other) { 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (&other == this) 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return; 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez JNIEnv* env = AttachCurrentThread(); 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (obj_) 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez env->DeleteWeakGlobalRef(obj_); 62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez obj_ = other.obj_ ? env->NewWeakGlobalRef(other.obj_) : NULL; 64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 65