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 #ifndef BASE_ANDROID_SCOPED_JAVA_REF_H_ 6*635a8641SAndroid Build Coastguard Worker #define BASE_ANDROID_SCOPED_JAVA_REF_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include <jni.h> 9*635a8641SAndroid Build Coastguard Worker #include <stddef.h> 10*635a8641SAndroid Build Coastguard Worker 11*635a8641SAndroid Build Coastguard Worker #include <type_traits> 12*635a8641SAndroid Build Coastguard Worker #include <utility> 13*635a8641SAndroid Build Coastguard Worker 14*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h" 15*635a8641SAndroid Build Coastguard Worker #include "base/logging.h" 16*635a8641SAndroid Build Coastguard Worker #include "base/macros.h" 17*635a8641SAndroid Build Coastguard Worker 18*635a8641SAndroid Build Coastguard Worker namespace base { 19*635a8641SAndroid Build Coastguard Worker namespace android { 20*635a8641SAndroid Build Coastguard Worker 21*635a8641SAndroid Build Coastguard Worker // Creates a new local reference frame, in which at least a given number of 22*635a8641SAndroid Build Coastguard Worker // local references can be created. Note that local references already created 23*635a8641SAndroid Build Coastguard Worker // in previous local frames are still valid in the current local frame. 24*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT ScopedJavaLocalFrame { 25*635a8641SAndroid Build Coastguard Worker public: 26*635a8641SAndroid Build Coastguard Worker explicit ScopedJavaLocalFrame(JNIEnv* env); 27*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalFrame(JNIEnv* env, int capacity); 28*635a8641SAndroid Build Coastguard Worker ~ScopedJavaLocalFrame(); 29*635a8641SAndroid Build Coastguard Worker 30*635a8641SAndroid Build Coastguard Worker private: 31*635a8641SAndroid Build Coastguard Worker // This class is only good for use on the thread it was created on so 32*635a8641SAndroid Build Coastguard Worker // it's safe to cache the non-threadsafe JNIEnv* inside this object. 33*635a8641SAndroid Build Coastguard Worker JNIEnv* env_; 34*635a8641SAndroid Build Coastguard Worker 35*635a8641SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(ScopedJavaLocalFrame); 36*635a8641SAndroid Build Coastguard Worker }; 37*635a8641SAndroid Build Coastguard Worker 38*635a8641SAndroid Build Coastguard Worker // Forward declare the generic java reference template class. 39*635a8641SAndroid Build Coastguard Worker template<typename T> class JavaRef; 40*635a8641SAndroid Build Coastguard Worker 41*635a8641SAndroid Build Coastguard Worker // Template specialization of JavaRef, which acts as the base class for all 42*635a8641SAndroid Build Coastguard Worker // other JavaRef<> template types. This allows you to e.g. pass 43*635a8641SAndroid Build Coastguard Worker // ScopedJavaLocalRef<jstring> into a function taking const JavaRef<jobject>& 44*635a8641SAndroid Build Coastguard Worker template<> 45*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT JavaRef<jobject> { 46*635a8641SAndroid Build Coastguard Worker public: 47*635a8641SAndroid Build Coastguard Worker // Initializes a null reference. Don't add anything else here; it's inlined. JavaRef()48*635a8641SAndroid Build Coastguard Worker constexpr JavaRef() : obj_(nullptr) {} 49*635a8641SAndroid Build Coastguard Worker 50*635a8641SAndroid Build Coastguard Worker // Allow nullptr to be converted to JavaRef. This avoids having to declare an 51*635a8641SAndroid Build Coastguard Worker // empty JavaRef just to pass null to a function, and makes C++ "nullptr" and 52*635a8641SAndroid Build Coastguard Worker // Java "null" equivalent. JavaRef(std::nullptr_t)53*635a8641SAndroid Build Coastguard Worker constexpr JavaRef(std::nullptr_t) : JavaRef() {} 54*635a8641SAndroid Build Coastguard Worker 55*635a8641SAndroid Build Coastguard Worker // Public to allow destruction of null JavaRef objects. 56*635a8641SAndroid Build Coastguard Worker // Don't add anything else here; it's inlined. ~JavaRef()57*635a8641SAndroid Build Coastguard Worker ~JavaRef() {} 58*635a8641SAndroid Build Coastguard Worker obj()59*635a8641SAndroid Build Coastguard Worker jobject obj() const { return obj_; } 60*635a8641SAndroid Build Coastguard Worker is_null()61*635a8641SAndroid Build Coastguard Worker bool is_null() const { return obj_ == nullptr; } 62*635a8641SAndroid Build Coastguard Worker 63*635a8641SAndroid Build Coastguard Worker protected: 64*635a8641SAndroid Build Coastguard Worker // Takes ownership of the |obj| reference passed; requires it to be a local 65*635a8641SAndroid Build Coastguard Worker // reference type. 66*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON() 67*635a8641SAndroid Build Coastguard Worker // Implementation contains a DCHECK; implement out-of-line when DCHECK_IS_ON. 68*635a8641SAndroid Build Coastguard Worker JavaRef(JNIEnv* env, jobject obj); 69*635a8641SAndroid Build Coastguard Worker #else 70*635a8641SAndroid Build Coastguard Worker // Don't add anything else here; it's inlined. 71*635a8641SAndroid Build Coastguard Worker JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {} 72*635a8641SAndroid Build Coastguard Worker #endif 73*635a8641SAndroid Build Coastguard Worker swap(JavaRef & other)74*635a8641SAndroid Build Coastguard Worker void swap(JavaRef& other) { std::swap(obj_, other.obj_); } 75*635a8641SAndroid Build Coastguard Worker 76*635a8641SAndroid Build Coastguard Worker // The following are implementation detail convenience methods, for 77*635a8641SAndroid Build Coastguard Worker // use by the sub-classes. 78*635a8641SAndroid Build Coastguard Worker JNIEnv* SetNewLocalRef(JNIEnv* env, jobject obj); 79*635a8641SAndroid Build Coastguard Worker void SetNewGlobalRef(JNIEnv* env, jobject obj); 80*635a8641SAndroid Build Coastguard Worker void ResetLocalRef(JNIEnv* env); 81*635a8641SAndroid Build Coastguard Worker void ResetGlobalRef(); 82*635a8641SAndroid Build Coastguard Worker jobject ReleaseInternal(); 83*635a8641SAndroid Build Coastguard Worker 84*635a8641SAndroid Build Coastguard Worker private: 85*635a8641SAndroid Build Coastguard Worker jobject obj_; 86*635a8641SAndroid Build Coastguard Worker 87*635a8641SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(JavaRef); 88*635a8641SAndroid Build Coastguard Worker }; 89*635a8641SAndroid Build Coastguard Worker 90*635a8641SAndroid Build Coastguard Worker // Generic base class for ScopedJavaLocalRef and ScopedJavaGlobalRef. Useful 91*635a8641SAndroid Build Coastguard Worker // for allowing functions to accept a reference without having to mandate 92*635a8641SAndroid Build Coastguard Worker // whether it is a local or global type. 93*635a8641SAndroid Build Coastguard Worker template<typename T> 94*635a8641SAndroid Build Coastguard Worker class JavaRef : public JavaRef<jobject> { 95*635a8641SAndroid Build Coastguard Worker public: JavaRef()96*635a8641SAndroid Build Coastguard Worker JavaRef() {} JavaRef(std::nullptr_t)97*635a8641SAndroid Build Coastguard Worker JavaRef(std::nullptr_t) : JavaRef<jobject>(nullptr) {} ~JavaRef()98*635a8641SAndroid Build Coastguard Worker ~JavaRef() {} 99*635a8641SAndroid Build Coastguard Worker obj()100*635a8641SAndroid Build Coastguard Worker T obj() const { return static_cast<T>(JavaRef<jobject>::obj()); } 101*635a8641SAndroid Build Coastguard Worker 102*635a8641SAndroid Build Coastguard Worker protected: JavaRef(JNIEnv * env,T obj)103*635a8641SAndroid Build Coastguard Worker JavaRef(JNIEnv* env, T obj) : JavaRef<jobject>(env, obj) {} 104*635a8641SAndroid Build Coastguard Worker 105*635a8641SAndroid Build Coastguard Worker private: 106*635a8641SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(JavaRef); 107*635a8641SAndroid Build Coastguard Worker }; 108*635a8641SAndroid Build Coastguard Worker 109*635a8641SAndroid Build Coastguard Worker // Holds a local reference to a JNI method parameter. 110*635a8641SAndroid Build Coastguard Worker // Method parameters should not be deleted, and so this class exists purely to 111*635a8641SAndroid Build Coastguard Worker // wrap them as a JavaRef<T> in the JNI binding generator. Do not create 112*635a8641SAndroid Build Coastguard Worker // instances manually. 113*635a8641SAndroid Build Coastguard Worker template<typename T> 114*635a8641SAndroid Build Coastguard Worker class JavaParamRef : public JavaRef<T> { 115*635a8641SAndroid Build Coastguard Worker public: 116*635a8641SAndroid Build Coastguard Worker // Assumes that |obj| is a parameter passed to a JNI method from Java. 117*635a8641SAndroid Build Coastguard Worker // Does not assume ownership as parameters should not be deleted. JavaParamRef(JNIEnv * env,T obj)118*635a8641SAndroid Build Coastguard Worker JavaParamRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj) {} 119*635a8641SAndroid Build Coastguard Worker 120*635a8641SAndroid Build Coastguard Worker // Allow nullptr to be converted to JavaParamRef. Some unit tests call JNI 121*635a8641SAndroid Build Coastguard Worker // methods directly from C++ and pass null for objects which are not actually 122*635a8641SAndroid Build Coastguard Worker // used by the implementation (e.g. the caller object); allow this to keep 123*635a8641SAndroid Build Coastguard Worker // working. JavaParamRef(std::nullptr_t)124*635a8641SAndroid Build Coastguard Worker JavaParamRef(std::nullptr_t) : JavaRef<T>(nullptr) {} 125*635a8641SAndroid Build Coastguard Worker ~JavaParamRef()126*635a8641SAndroid Build Coastguard Worker ~JavaParamRef() {} 127*635a8641SAndroid Build Coastguard Worker 128*635a8641SAndroid Build Coastguard Worker // TODO(torne): remove this cast once we're using JavaRef consistently. 129*635a8641SAndroid Build Coastguard Worker // http://crbug.com/506850 T()130*635a8641SAndroid Build Coastguard Worker operator T() const { return JavaRef<T>::obj(); } 131*635a8641SAndroid Build Coastguard Worker 132*635a8641SAndroid Build Coastguard Worker private: 133*635a8641SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(JavaParamRef); 134*635a8641SAndroid Build Coastguard Worker }; 135*635a8641SAndroid Build Coastguard Worker 136*635a8641SAndroid Build Coastguard Worker // Holds a local reference to a Java object. The local reference is scoped 137*635a8641SAndroid Build Coastguard Worker // to the lifetime of this object. 138*635a8641SAndroid Build Coastguard Worker // Instances of this class may hold onto any JNIEnv passed into it until 139*635a8641SAndroid Build Coastguard Worker // destroyed. Therefore, since a JNIEnv is only suitable for use on a single 140*635a8641SAndroid Build Coastguard Worker // thread, objects of this class must be created, used, and destroyed, on a 141*635a8641SAndroid Build Coastguard Worker // single thread. 142*635a8641SAndroid Build Coastguard Worker // Therefore, this class should only be used as a stack-based object and from a 143*635a8641SAndroid Build Coastguard Worker // single thread. If you wish to have the reference outlive the current 144*635a8641SAndroid Build Coastguard Worker // callstack (e.g. as a class member) or you wish to pass it across threads, 145*635a8641SAndroid Build Coastguard Worker // use a ScopedJavaGlobalRef instead. 146*635a8641SAndroid Build Coastguard Worker template<typename T> 147*635a8641SAndroid Build Coastguard Worker class ScopedJavaLocalRef : public JavaRef<T> { 148*635a8641SAndroid Build Coastguard Worker public: ScopedJavaLocalRef()149*635a8641SAndroid Build Coastguard Worker constexpr ScopedJavaLocalRef() : env_(nullptr) {} ScopedJavaLocalRef(std::nullptr_t)150*635a8641SAndroid Build Coastguard Worker constexpr ScopedJavaLocalRef(std::nullptr_t) : env_(nullptr) {} 151*635a8641SAndroid Build Coastguard Worker 152*635a8641SAndroid Build Coastguard Worker // Non-explicit copy constructor, to allow ScopedJavaLocalRef to be returned 153*635a8641SAndroid Build Coastguard Worker // by value as this is the normal usage pattern. ScopedJavaLocalRef(const ScopedJavaLocalRef<T> & other)154*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef(const ScopedJavaLocalRef<T>& other) 155*635a8641SAndroid Build Coastguard Worker : env_(other.env_) { 156*635a8641SAndroid Build Coastguard Worker this->SetNewLocalRef(env_, other.obj()); 157*635a8641SAndroid Build Coastguard Worker } 158*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef(ScopedJavaLocalRef<T> && other)159*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef(ScopedJavaLocalRef<T>&& other) : env_(other.env_) { 160*635a8641SAndroid Build Coastguard Worker this->swap(other); 161*635a8641SAndroid Build Coastguard Worker } 162*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef(const JavaRef<T> & other)163*635a8641SAndroid Build Coastguard Worker explicit ScopedJavaLocalRef(const JavaRef<T>& other) : env_(nullptr) { 164*635a8641SAndroid Build Coastguard Worker this->Reset(other); 165*635a8641SAndroid Build Coastguard Worker } 166*635a8641SAndroid Build Coastguard Worker 167*635a8641SAndroid Build Coastguard Worker // Assumes that |obj| is a local reference to a Java object and takes 168*635a8641SAndroid Build Coastguard Worker // ownership of this local reference. 169*635a8641SAndroid Build Coastguard Worker // TODO(torne): this shouldn't be used outside of JNI helper functions but 170*635a8641SAndroid Build Coastguard Worker // there are currently some cases where there aren't helpers for things. ScopedJavaLocalRef(JNIEnv * env,T obj)171*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj), env_(env) {} 172*635a8641SAndroid Build Coastguard Worker ~ScopedJavaLocalRef()173*635a8641SAndroid Build Coastguard Worker ~ScopedJavaLocalRef() { 174*635a8641SAndroid Build Coastguard Worker this->Reset(); 175*635a8641SAndroid Build Coastguard Worker } 176*635a8641SAndroid Build Coastguard Worker 177*635a8641SAndroid Build Coastguard Worker // Overloaded assignment operator defined for consistency with the implicit 178*635a8641SAndroid Build Coastguard Worker // copy constructor. 179*635a8641SAndroid Build Coastguard Worker void operator=(const ScopedJavaLocalRef<T>& other) { 180*635a8641SAndroid Build Coastguard Worker this->Reset(other); 181*635a8641SAndroid Build Coastguard Worker } 182*635a8641SAndroid Build Coastguard Worker 183*635a8641SAndroid Build Coastguard Worker void operator=(ScopedJavaLocalRef<T>&& other) { 184*635a8641SAndroid Build Coastguard Worker env_ = other.env_; 185*635a8641SAndroid Build Coastguard Worker this->swap(other); 186*635a8641SAndroid Build Coastguard Worker } 187*635a8641SAndroid Build Coastguard Worker Reset()188*635a8641SAndroid Build Coastguard Worker void Reset() { 189*635a8641SAndroid Build Coastguard Worker this->ResetLocalRef(env_); 190*635a8641SAndroid Build Coastguard Worker } 191*635a8641SAndroid Build Coastguard Worker Reset(const ScopedJavaLocalRef<T> & other)192*635a8641SAndroid Build Coastguard Worker void Reset(const ScopedJavaLocalRef<T>& other) { 193*635a8641SAndroid Build Coastguard Worker // We can copy over env_ here as |other| instance must be from the same 194*635a8641SAndroid Build Coastguard Worker // thread as |this| local ref. (See class comment for multi-threading 195*635a8641SAndroid Build Coastguard Worker // limitations, and alternatives). 196*635a8641SAndroid Build Coastguard Worker this->Reset(other.env_, other.obj()); 197*635a8641SAndroid Build Coastguard Worker } 198*635a8641SAndroid Build Coastguard Worker Reset(const JavaRef<T> & other)199*635a8641SAndroid Build Coastguard Worker void Reset(const JavaRef<T>& other) { 200*635a8641SAndroid Build Coastguard Worker // If |env_| was not yet set (is still null) it will be attached to the 201*635a8641SAndroid Build Coastguard Worker // current thread in SetNewLocalRef(). 202*635a8641SAndroid Build Coastguard Worker this->Reset(env_, other.obj()); 203*635a8641SAndroid Build Coastguard Worker } 204*635a8641SAndroid Build Coastguard Worker 205*635a8641SAndroid Build Coastguard Worker // Creates a new local reference to the Java object, unlike the constructor 206*635a8641SAndroid Build Coastguard Worker // with the same parameters that takes ownership of the existing reference. 207*635a8641SAndroid Build Coastguard Worker // TODO(torne): these should match as this is confusing. Reset(JNIEnv * env,T obj)208*635a8641SAndroid Build Coastguard Worker void Reset(JNIEnv* env, T obj) { env_ = this->SetNewLocalRef(env, obj); } 209*635a8641SAndroid Build Coastguard Worker 210*635a8641SAndroid Build Coastguard Worker // Releases the local reference to the caller. The caller *must* delete the 211*635a8641SAndroid Build Coastguard Worker // local reference when it is done with it. Note that calling a Java method 212*635a8641SAndroid Build Coastguard Worker // is *not* a transfer of ownership and Release() should not be used. Release()213*635a8641SAndroid Build Coastguard Worker T Release() { 214*635a8641SAndroid Build Coastguard Worker return static_cast<T>(this->ReleaseInternal()); 215*635a8641SAndroid Build Coastguard Worker } 216*635a8641SAndroid Build Coastguard Worker 217*635a8641SAndroid Build Coastguard Worker private: 218*635a8641SAndroid Build Coastguard Worker // This class is only good for use on the thread it was created on so 219*635a8641SAndroid Build Coastguard Worker // it's safe to cache the non-threadsafe JNIEnv* inside this object. 220*635a8641SAndroid Build Coastguard Worker JNIEnv* env_; 221*635a8641SAndroid Build Coastguard Worker 222*635a8641SAndroid Build Coastguard Worker // Prevent ScopedJavaLocalRef(JNIEnv*, T obj) from being used to take 223*635a8641SAndroid Build Coastguard Worker // ownership of a JavaParamRef's underlying object - parameters are not 224*635a8641SAndroid Build Coastguard Worker // allowed to be deleted and so should not be owned by ScopedJavaLocalRef. 225*635a8641SAndroid Build Coastguard Worker // TODO(torne): this can be removed once JavaParamRef no longer has an 226*635a8641SAndroid Build Coastguard Worker // implicit conversion back to T. 227*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef(JNIEnv* env, const JavaParamRef<T>& other); 228*635a8641SAndroid Build Coastguard Worker }; 229*635a8641SAndroid Build Coastguard Worker 230*635a8641SAndroid Build Coastguard Worker // Holds a global reference to a Java object. The global reference is scoped 231*635a8641SAndroid Build Coastguard Worker // to the lifetime of this object. This class does not hold onto any JNIEnv* 232*635a8641SAndroid Build Coastguard Worker // passed to it, hence it is safe to use across threads (within the constraints 233*635a8641SAndroid Build Coastguard Worker // imposed by the underlying Java object that it references). 234*635a8641SAndroid Build Coastguard Worker template<typename T> 235*635a8641SAndroid Build Coastguard Worker class ScopedJavaGlobalRef : public JavaRef<T> { 236*635a8641SAndroid Build Coastguard Worker public: ScopedJavaGlobalRef()237*635a8641SAndroid Build Coastguard Worker constexpr ScopedJavaGlobalRef() {} ScopedJavaGlobalRef(std::nullptr_t)238*635a8641SAndroid Build Coastguard Worker constexpr ScopedJavaGlobalRef(std::nullptr_t) {} 239*635a8641SAndroid Build Coastguard Worker ScopedJavaGlobalRef(const ScopedJavaGlobalRef<T> & other)240*635a8641SAndroid Build Coastguard Worker ScopedJavaGlobalRef(const ScopedJavaGlobalRef<T>& other) { 241*635a8641SAndroid Build Coastguard Worker this->Reset(other); 242*635a8641SAndroid Build Coastguard Worker } 243*635a8641SAndroid Build Coastguard Worker ScopedJavaGlobalRef(ScopedJavaGlobalRef<T> && other)244*635a8641SAndroid Build Coastguard Worker ScopedJavaGlobalRef(ScopedJavaGlobalRef<T>&& other) { this->swap(other); } 245*635a8641SAndroid Build Coastguard Worker ScopedJavaGlobalRef(JNIEnv * env,T obj)246*635a8641SAndroid Build Coastguard Worker ScopedJavaGlobalRef(JNIEnv* env, T obj) { this->Reset(env, obj); } 247*635a8641SAndroid Build Coastguard Worker ScopedJavaGlobalRef(const JavaRef<T> & other)248*635a8641SAndroid Build Coastguard Worker explicit ScopedJavaGlobalRef(const JavaRef<T>& other) { this->Reset(other); } 249*635a8641SAndroid Build Coastguard Worker ~ScopedJavaGlobalRef()250*635a8641SAndroid Build Coastguard Worker ~ScopedJavaGlobalRef() { 251*635a8641SAndroid Build Coastguard Worker this->Reset(); 252*635a8641SAndroid Build Coastguard Worker } 253*635a8641SAndroid Build Coastguard Worker 254*635a8641SAndroid Build Coastguard Worker // Overloaded assignment operator defined for consistency with the implicit 255*635a8641SAndroid Build Coastguard Worker // copy constructor. 256*635a8641SAndroid Build Coastguard Worker void operator=(const ScopedJavaGlobalRef<T>& other) { 257*635a8641SAndroid Build Coastguard Worker this->Reset(other); 258*635a8641SAndroid Build Coastguard Worker } 259*635a8641SAndroid Build Coastguard Worker 260*635a8641SAndroid Build Coastguard Worker void operator=(ScopedJavaGlobalRef<T>&& other) { this->swap(other); } 261*635a8641SAndroid Build Coastguard Worker Reset()262*635a8641SAndroid Build Coastguard Worker void Reset() { 263*635a8641SAndroid Build Coastguard Worker this->ResetGlobalRef(); 264*635a8641SAndroid Build Coastguard Worker } 265*635a8641SAndroid Build Coastguard Worker Reset(const JavaRef<T> & other)266*635a8641SAndroid Build Coastguard Worker void Reset(const JavaRef<T>& other) { this->Reset(nullptr, other.obj()); } 267*635a8641SAndroid Build Coastguard Worker Reset(JNIEnv * env,const JavaParamRef<T> & other)268*635a8641SAndroid Build Coastguard Worker void Reset(JNIEnv* env, const JavaParamRef<T>& other) { 269*635a8641SAndroid Build Coastguard Worker this->Reset(env, other.obj()); 270*635a8641SAndroid Build Coastguard Worker } 271*635a8641SAndroid Build Coastguard Worker Reset(JNIEnv * env,T obj)272*635a8641SAndroid Build Coastguard Worker void Reset(JNIEnv* env, T obj) { this->SetNewGlobalRef(env, obj); } 273*635a8641SAndroid Build Coastguard Worker 274*635a8641SAndroid Build Coastguard Worker // Releases the global reference to the caller. The caller *must* delete the 275*635a8641SAndroid Build Coastguard Worker // global reference when it is done with it. Note that calling a Java method 276*635a8641SAndroid Build Coastguard Worker // is *not* a transfer of ownership and Release() should not be used. Release()277*635a8641SAndroid Build Coastguard Worker T Release() { 278*635a8641SAndroid Build Coastguard Worker return static_cast<T>(this->ReleaseInternal()); 279*635a8641SAndroid Build Coastguard Worker } 280*635a8641SAndroid Build Coastguard Worker }; 281*635a8641SAndroid Build Coastguard Worker 282*635a8641SAndroid Build Coastguard Worker } // namespace android 283*635a8641SAndroid Build Coastguard Worker } // namespace base 284*635a8641SAndroid Build Coastguard Worker 285*635a8641SAndroid Build Coastguard Worker #endif // BASE_ANDROID_SCOPED_JAVA_REF_H_ 286