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 JavaRef<jobject>::JavaRef() : obj_(NULL) {} 32 33 JavaRef<jobject>::JavaRef(JNIEnv* env, jobject obj) : obj_(obj) { 34 if (obj) { 35 DCHECK(env && env->GetObjectRefType(obj) == JNILocalRefType); 36 } 37 } 38 39 JavaRef<jobject>::~JavaRef() { 40 } 41 42 JNIEnv* JavaRef<jobject>::SetNewLocalRef(JNIEnv* env, jobject obj) { 43 if (!env) { 44 env = AttachCurrentThread(); 45 } else { 46 DCHECK_EQ(env, AttachCurrentThread()); // Is |env| on correct thread. 47 } 48 if (obj) 49 obj = env->NewLocalRef(obj); 50 if (obj_) 51 env->DeleteLocalRef(obj_); 52 obj_ = obj; 53 return env; 54 } 55 56 void JavaRef<jobject>::SetNewGlobalRef(JNIEnv* env, jobject obj) { 57 if (!env) { 58 env = AttachCurrentThread(); 59 } else { 60 DCHECK_EQ(env, AttachCurrentThread()); // Is |env| on correct thread. 61 } 62 if (obj) 63 obj = env->NewGlobalRef(obj); 64 if (obj_) 65 env->DeleteGlobalRef(obj_); 66 obj_ = obj; 67 } 68 69 void JavaRef<jobject>::ResetLocalRef(JNIEnv* env) { 70 if (obj_) { 71 DCHECK_EQ(env, AttachCurrentThread()); // Is |env| on correct thread. 72 env->DeleteLocalRef(obj_); 73 obj_ = NULL; 74 } 75 } 76 77 void JavaRef<jobject>::ResetGlobalRef() { 78 if (obj_) { 79 AttachCurrentThread()->DeleteGlobalRef(obj_); 80 obj_ = NULL; 81 } 82 } 83 84 jobject JavaRef<jobject>::ReleaseInternal() { 85 jobject obj = obj_; 86 obj_ = NULL; 87 return obj; 88 } 89 90 } // namespace android 91 } // namespace base 92