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