xref: /aosp_15_r20/external/libchrome/base/android/scoped_java_ref.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/android/scoped_java_ref.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include "base/android/jni_android.h"
8*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker namespace base {
11*635a8641SAndroid Build Coastguard Worker namespace android {
12*635a8641SAndroid Build Coastguard Worker namespace {
13*635a8641SAndroid Build Coastguard Worker 
14*635a8641SAndroid Build Coastguard Worker const int kDefaultLocalFrameCapacity = 16;
15*635a8641SAndroid Build Coastguard Worker 
16*635a8641SAndroid Build Coastguard Worker }  // namespace
17*635a8641SAndroid Build Coastguard Worker 
ScopedJavaLocalFrame(JNIEnv * env)18*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env) : env_(env) {
19*635a8641SAndroid Build Coastguard Worker   int failed = env_->PushLocalFrame(kDefaultLocalFrameCapacity);
20*635a8641SAndroid Build Coastguard Worker   DCHECK(!failed);
21*635a8641SAndroid Build Coastguard Worker }
22*635a8641SAndroid Build Coastguard Worker 
ScopedJavaLocalFrame(JNIEnv * env,int capacity)23*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env, int capacity)
24*635a8641SAndroid Build Coastguard Worker     : env_(env) {
25*635a8641SAndroid Build Coastguard Worker   int failed = env_->PushLocalFrame(capacity);
26*635a8641SAndroid Build Coastguard Worker   DCHECK(!failed);
27*635a8641SAndroid Build Coastguard Worker }
28*635a8641SAndroid Build Coastguard Worker 
~ScopedJavaLocalFrame()29*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalFrame::~ScopedJavaLocalFrame() {
30*635a8641SAndroid Build Coastguard Worker   env_->PopLocalFrame(nullptr);
31*635a8641SAndroid Build Coastguard Worker }
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
34*635a8641SAndroid Build Coastguard Worker // This constructor is inlined when DCHECKs are disabled; don't add anything
35*635a8641SAndroid Build Coastguard Worker // else here.
JavaRef(JNIEnv * env,jobject obj)36*635a8641SAndroid Build Coastguard Worker JavaRef<jobject>::JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {
37*635a8641SAndroid Build Coastguard Worker   if (obj) {
38*635a8641SAndroid Build Coastguard Worker     DCHECK(env && env->GetObjectRefType(obj) == JNILocalRefType);
39*635a8641SAndroid Build Coastguard Worker   }
40*635a8641SAndroid Build Coastguard Worker }
41*635a8641SAndroid Build Coastguard Worker #endif
42*635a8641SAndroid Build Coastguard Worker 
SetNewLocalRef(JNIEnv * env,jobject obj)43*635a8641SAndroid Build Coastguard Worker JNIEnv* JavaRef<jobject>::SetNewLocalRef(JNIEnv* env, jobject obj) {
44*635a8641SAndroid Build Coastguard Worker   if (!env) {
45*635a8641SAndroid Build Coastguard Worker     env = AttachCurrentThread();
46*635a8641SAndroid Build Coastguard Worker   } else {
47*635a8641SAndroid Build Coastguard Worker     DCHECK_EQ(env, AttachCurrentThread());  // Is |env| on correct thread.
48*635a8641SAndroid Build Coastguard Worker   }
49*635a8641SAndroid Build Coastguard Worker   if (obj)
50*635a8641SAndroid Build Coastguard Worker     obj = env->NewLocalRef(obj);
51*635a8641SAndroid Build Coastguard Worker   if (obj_)
52*635a8641SAndroid Build Coastguard Worker     env->DeleteLocalRef(obj_);
53*635a8641SAndroid Build Coastguard Worker   obj_ = obj;
54*635a8641SAndroid Build Coastguard Worker   return env;
55*635a8641SAndroid Build Coastguard Worker }
56*635a8641SAndroid Build Coastguard Worker 
SetNewGlobalRef(JNIEnv * env,jobject obj)57*635a8641SAndroid Build Coastguard Worker void JavaRef<jobject>::SetNewGlobalRef(JNIEnv* env, jobject obj) {
58*635a8641SAndroid Build Coastguard Worker   if (!env) {
59*635a8641SAndroid Build Coastguard Worker     env = AttachCurrentThread();
60*635a8641SAndroid Build Coastguard Worker   } else {
61*635a8641SAndroid Build Coastguard Worker     DCHECK_EQ(env, AttachCurrentThread());  // Is |env| on correct thread.
62*635a8641SAndroid Build Coastguard Worker   }
63*635a8641SAndroid Build Coastguard Worker   if (obj)
64*635a8641SAndroid Build Coastguard Worker     obj = env->NewGlobalRef(obj);
65*635a8641SAndroid Build Coastguard Worker   if (obj_)
66*635a8641SAndroid Build Coastguard Worker     env->DeleteGlobalRef(obj_);
67*635a8641SAndroid Build Coastguard Worker   obj_ = obj;
68*635a8641SAndroid Build Coastguard Worker }
69*635a8641SAndroid Build Coastguard Worker 
ResetLocalRef(JNIEnv * env)70*635a8641SAndroid Build Coastguard Worker void JavaRef<jobject>::ResetLocalRef(JNIEnv* env) {
71*635a8641SAndroid Build Coastguard Worker   if (obj_) {
72*635a8641SAndroid Build Coastguard Worker     DCHECK_EQ(env, AttachCurrentThread());  // Is |env| on correct thread.
73*635a8641SAndroid Build Coastguard Worker     env->DeleteLocalRef(obj_);
74*635a8641SAndroid Build Coastguard Worker     obj_ = nullptr;
75*635a8641SAndroid Build Coastguard Worker   }
76*635a8641SAndroid Build Coastguard Worker }
77*635a8641SAndroid Build Coastguard Worker 
ResetGlobalRef()78*635a8641SAndroid Build Coastguard Worker void JavaRef<jobject>::ResetGlobalRef() {
79*635a8641SAndroid Build Coastguard Worker   if (obj_) {
80*635a8641SAndroid Build Coastguard Worker     AttachCurrentThread()->DeleteGlobalRef(obj_);
81*635a8641SAndroid Build Coastguard Worker     obj_ = nullptr;
82*635a8641SAndroid Build Coastguard Worker   }
83*635a8641SAndroid Build Coastguard Worker }
84*635a8641SAndroid Build Coastguard Worker 
ReleaseInternal()85*635a8641SAndroid Build Coastguard Worker jobject JavaRef<jobject>::ReleaseInternal() {
86*635a8641SAndroid Build Coastguard Worker   jobject obj = obj_;
87*635a8641SAndroid Build Coastguard Worker   obj_ = nullptr;
88*635a8641SAndroid Build Coastguard Worker   return obj;
89*635a8641SAndroid Build Coastguard Worker }
90*635a8641SAndroid Build Coastguard Worker 
91*635a8641SAndroid Build Coastguard Worker }  // namespace android
92*635a8641SAndroid Build Coastguard Worker }  // namespace base
93