Home | History | Annotate | Download | only in android
      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 
     18 ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env) : env_(env) {
     19   int failed = env_->PushLocalFrame(kDefaultLocalFrameCapacity);
     20   DCHECK(!failed);
     21 }
     22 
     23 ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env, int capacity)
     24     : env_(env) {
     25   int failed = env_->PushLocalFrame(capacity);
     26   DCHECK(!failed);
     27 }
     28 
     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.
     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 
     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 
     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 
     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 
     76 void JavaRef<jobject>::ResetGlobalRef() {
     77   if (obj_) {
     78     AttachCurrentThread()->DeleteGlobalRef(obj_);
     79     obj_ = NULL;
     80   }
     81 }
     82 
     83 jobject JavaRef<jobject>::ReleaseInternal() {
     84   jobject obj = obj_;
     85   obj_ = NULL;
     86   return obj;
     87 }
     88 
     89 }  // namespace android
     90 }  // namespace base
     91