scoped_java_ref.cc 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Copyright (c) 2012 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/scoped_java_ref.h"
  5. #include "base/android/jni_android.h"
  6. #include "base/check_op.h"
  7. namespace base {
  8. namespace android {
  9. namespace {
  10. const int kDefaultLocalFrameCapacity = 16;
  11. } // namespace
  12. ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env) : env_(env) {
  13. int failed = env_->PushLocalFrame(kDefaultLocalFrameCapacity);
  14. DCHECK(!failed);
  15. }
  16. ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env, int capacity)
  17. : env_(env) {
  18. int failed = env_->PushLocalFrame(capacity);
  19. DCHECK(!failed);
  20. }
  21. ScopedJavaLocalFrame::~ScopedJavaLocalFrame() {
  22. env_->PopLocalFrame(nullptr);
  23. }
  24. #if DCHECK_IS_ON()
  25. // This constructor is inlined when DCHECKs are disabled; don't add anything
  26. // else here.
  27. JavaRef<jobject>::JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {
  28. if (obj) {
  29. DCHECK(env && env->GetObjectRefType(obj) == JNILocalRefType);
  30. }
  31. }
  32. #endif
  33. JNIEnv* JavaRef<jobject>::SetNewLocalRef(JNIEnv* env, jobject obj) {
  34. if (!env) {
  35. env = AttachCurrentThread();
  36. } else {
  37. DCHECK_EQ(env, AttachCurrentThread()); // Is |env| on correct thread.
  38. }
  39. if (obj)
  40. obj = env->NewLocalRef(obj);
  41. if (obj_)
  42. env->DeleteLocalRef(obj_);
  43. obj_ = obj;
  44. return env;
  45. }
  46. void JavaRef<jobject>::SetNewGlobalRef(JNIEnv* env, jobject obj) {
  47. if (!env) {
  48. env = AttachCurrentThread();
  49. } else {
  50. DCHECK_EQ(env, AttachCurrentThread()); // Is |env| on correct thread.
  51. }
  52. if (obj)
  53. obj = env->NewGlobalRef(obj);
  54. if (obj_)
  55. env->DeleteGlobalRef(obj_);
  56. obj_ = obj;
  57. }
  58. void JavaRef<jobject>::ResetLocalRef(JNIEnv* env) {
  59. if (obj_) {
  60. DCHECK_EQ(env, AttachCurrentThread()); // Is |env| on correct thread.
  61. env->DeleteLocalRef(obj_);
  62. obj_ = nullptr;
  63. }
  64. }
  65. void JavaRef<jobject>::ResetGlobalRef() {
  66. if (obj_) {
  67. AttachCurrentThread()->DeleteGlobalRef(obj_);
  68. obj_ = nullptr;
  69. }
  70. }
  71. jobject JavaRef<jobject>::ReleaseInternal() {
  72. jobject obj = obj_;
  73. obj_ = nullptr;
  74. return obj;
  75. }
  76. } // namespace android
  77. } // namespace base