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