• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "flutter/fml/platform/android/jni_weak_ref.h"
6 
7 #include "flutter/fml/logging.h"
8 #include "flutter/fml/platform/android/jni_util.h"
9 
10 namespace fml {
11 namespace jni {
12 
JavaObjectWeakGlobalRef()13 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef() : obj_(NULL) {}
14 
JavaObjectWeakGlobalRef(const JavaObjectWeakGlobalRef & orig)15 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
16     const JavaObjectWeakGlobalRef& orig)
17     : obj_(NULL) {
18   Assign(orig);
19 }
20 
JavaObjectWeakGlobalRef(JNIEnv * env,jobject obj)21 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj)
22     : obj_(env->NewWeakGlobalRef(obj)) {
23   FML_DCHECK(obj_);
24 }
25 
~JavaObjectWeakGlobalRef()26 JavaObjectWeakGlobalRef::~JavaObjectWeakGlobalRef() {
27   reset();
28 }
29 
operator =(const JavaObjectWeakGlobalRef & rhs)30 void JavaObjectWeakGlobalRef::operator=(const JavaObjectWeakGlobalRef& rhs) {
31   Assign(rhs);
32 }
33 
reset()34 void JavaObjectWeakGlobalRef::reset() {
35   if (obj_) {
36     AttachCurrentThread()->DeleteWeakGlobalRef(obj_);
37     obj_ = NULL;
38   }
39 }
40 
get(JNIEnv * env) const41 ScopedJavaLocalRef<jobject> JavaObjectWeakGlobalRef::get(JNIEnv* env) const {
42   return GetRealObject(env, obj_);
43 }
44 
GetRealObject(JNIEnv * env,jweak obj)45 ScopedJavaLocalRef<jobject> GetRealObject(JNIEnv* env, jweak obj) {
46   jobject real = NULL;
47   if (obj) {
48     real = env->NewLocalRef(obj);
49     if (!real) {
50       FML_DLOG(ERROR) << "The real object has been deleted!";
51     }
52   }
53   return ScopedJavaLocalRef<jobject>(env, real);
54 }
55 
Assign(const JavaObjectWeakGlobalRef & other)56 void JavaObjectWeakGlobalRef::Assign(const JavaObjectWeakGlobalRef& other) {
57   if (&other == this)
58     return;
59 
60   JNIEnv* env = AttachCurrentThread();
61   if (obj_)
62     env->DeleteWeakGlobalRef(obj_);
63 
64   obj_ = other.obj_ ? env->NewWeakGlobalRef(other.obj_) : NULL;
65 }
66 
67 }  // namespace jni
68 }  // namespace fml
69