jni_weak_ref.cc 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright 2014 The Chromium 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. #include "base/android/jni_weak_ref.h"
  5. #include <utility>
  6. #include "base/android/jni_android.h"
  7. using base::android::AttachCurrentThread;
  8. JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef() : obj_(nullptr) {}
  9. JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
  10. const JavaObjectWeakGlobalRef& orig)
  11. : obj_(nullptr) {
  12. Assign(orig);
  13. }
  14. JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
  15. JavaObjectWeakGlobalRef&& orig) noexcept
  16. : obj_(orig.obj_) {
  17. orig.obj_ = nullptr;
  18. }
  19. JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj)
  20. : obj_(env->NewWeakGlobalRef(obj)) {
  21. }
  22. JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
  23. JNIEnv* env,
  24. const base::android::JavaRef<jobject>& obj)
  25. : obj_(env->NewWeakGlobalRef(obj.obj())) {
  26. }
  27. JavaObjectWeakGlobalRef::~JavaObjectWeakGlobalRef() {
  28. reset();
  29. }
  30. void JavaObjectWeakGlobalRef::operator=(const JavaObjectWeakGlobalRef& rhs) {
  31. Assign(rhs);
  32. }
  33. void JavaObjectWeakGlobalRef::operator=(JavaObjectWeakGlobalRef&& rhs) {
  34. std::swap(obj_, rhs.obj_);
  35. }
  36. void JavaObjectWeakGlobalRef::reset() {
  37. if (obj_) {
  38. AttachCurrentThread()->DeleteWeakGlobalRef(obj_);
  39. obj_ = nullptr;
  40. }
  41. }
  42. base::android::ScopedJavaLocalRef<jobject>
  43. JavaObjectWeakGlobalRef::get(JNIEnv* env) const {
  44. return GetRealObject(env, obj_);
  45. }
  46. base::android::ScopedJavaLocalRef<jobject> GetRealObject(
  47. JNIEnv* env, jweak obj) {
  48. jobject real = nullptr;
  49. if (obj)
  50. real = env->NewLocalRef(obj);
  51. return base::android::ScopedJavaLocalRef<jobject>(env, real);
  52. }
  53. void JavaObjectWeakGlobalRef::Assign(const JavaObjectWeakGlobalRef& other) {
  54. if (&other == this)
  55. return;
  56. JNIEnv* env = AttachCurrentThread();
  57. if (obj_)
  58. env->DeleteWeakGlobalRef(obj_);
  59. obj_ = other.obj_ ? env->NewWeakGlobalRef(other.obj_) : nullptr;
  60. }