Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BASE_ANDROID_SCOPED_JAVA_REF_H_ | 5 #ifndef BASE_ANDROID_SCOPED_JAVA_REF_H_ |
| 6 #define BASE_ANDROID_SCOPED_JAVA_REF_H_ | 6 #define BASE_ANDROID_SCOPED_JAVA_REF_H_ |
| 7 | 7 |
| 8 #include <jni.h> | 8 #include <jni.h> |
| 9 #include <stddef.h> | 9 #include <stddef.h> |
| 10 | 10 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 35 | 35 |
| 36 // Forward declare the generic java reference template class. | 36 // Forward declare the generic java reference template class. |
| 37 template<typename T> class JavaRef; | 37 template<typename T> class JavaRef; |
| 38 | 38 |
| 39 // Template specialization of JavaRef, which acts as the base class for all | 39 // Template specialization of JavaRef, which acts as the base class for all |
| 40 // other JavaRef<> template types. This allows you to e.g. pass | 40 // other JavaRef<> template types. This allows you to e.g. pass |
| 41 // ScopedJavaLocalRef<jstring> into a function taking const JavaRef<jobject>& | 41 // ScopedJavaLocalRef<jstring> into a function taking const JavaRef<jobject>& |
| 42 template<> | 42 template<> |
| 43 class BASE_EXPORT JavaRef<jobject> { | 43 class BASE_EXPORT JavaRef<jobject> { |
| 44 public: | 44 public: |
| 45 // ALlow nullptr to be converted to JavaRef. This avoids having to declare an | |
|
Yaron
2015/12/02 19:42:10
Allow
| |
| 46 // empty ScopedJavaLocalRef just to pass null to a function with a JavaRef | |
| 47 // parameter, and makes C++ "nullptr" and Java "null" equivalent. | |
| 48 JavaRef(std::nullptr_t) : JavaRef() {} | |
| 49 | |
| 50 // Public to allow destruction of temporary JavaRef objects created by the | |
| 51 // nullptr conversion. Don't add anything else here; it's inlined. | |
| 52 ~JavaRef() {} | |
| 53 | |
| 45 jobject obj() const { return obj_; } | 54 jobject obj() const { return obj_; } |
| 46 | 55 |
| 47 bool is_null() const { return obj_ == NULL; } | 56 bool is_null() const { return obj_ == NULL; } |
| 48 | 57 |
| 49 protected: | 58 protected: |
| 50 // Initializes a NULL reference. Don't add anything else here; it's inlined. | 59 // Initializes a NULL reference. Don't add anything else here; it's inlined. |
| 51 JavaRef() : obj_(NULL) {} | 60 JavaRef() : obj_(NULL) {} |
| 52 | 61 |
| 53 // Takes ownership of the |obj| reference passed; requires it to be a local | 62 // Takes ownership of the |obj| reference passed; requires it to be a local |
| 54 // reference type. | 63 // reference type. |
| 55 #if DCHECK_IS_ON() | 64 #if DCHECK_IS_ON() |
| 56 // Implementation contains a DCHECK; implement out-of-line when DCHECK_IS_ON. | 65 // Implementation contains a DCHECK; implement out-of-line when DCHECK_IS_ON. |
| 57 JavaRef(JNIEnv* env, jobject obj); | 66 JavaRef(JNIEnv* env, jobject obj); |
| 58 #else | 67 #else |
| 59 // Don't add anything else here; it's inlined. | 68 // Don't add anything else here; it's inlined. |
| 60 JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {} | 69 JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {} |
| 61 #endif | 70 #endif |
| 62 | 71 |
| 63 // Don't add anything else here; it's inlined. | |
| 64 ~JavaRef() {} | |
| 65 | |
| 66 // The following are implementation detail convenience methods, for | 72 // The following are implementation detail convenience methods, for |
| 67 // use by the sub-classes. | 73 // use by the sub-classes. |
| 68 JNIEnv* SetNewLocalRef(JNIEnv* env, jobject obj); | 74 JNIEnv* SetNewLocalRef(JNIEnv* env, jobject obj); |
| 69 void SetNewGlobalRef(JNIEnv* env, jobject obj); | 75 void SetNewGlobalRef(JNIEnv* env, jobject obj); |
| 70 void ResetLocalRef(JNIEnv* env); | 76 void ResetLocalRef(JNIEnv* env); |
| 71 void ResetGlobalRef(); | 77 void ResetGlobalRef(); |
| 72 jobject ReleaseInternal(); | 78 jobject ReleaseInternal(); |
| 73 | 79 |
| 74 private: | 80 private: |
| 75 jobject obj_; | 81 jobject obj_; |
| 76 | 82 |
| 77 DISALLOW_COPY_AND_ASSIGN(JavaRef); | 83 DISALLOW_COPY_AND_ASSIGN(JavaRef); |
| 78 }; | 84 }; |
| 79 | 85 |
| 80 // Generic base class for ScopedJavaLocalRef and ScopedJavaGlobalRef. Useful | 86 // Generic base class for ScopedJavaLocalRef and ScopedJavaGlobalRef. Useful |
| 81 // for allowing functions to accept a reference without having to mandate | 87 // for allowing functions to accept a reference without having to mandate |
| 82 // whether it is a local or global type. | 88 // whether it is a local or global type. |
| 83 template<typename T> | 89 template<typename T> |
| 84 class JavaRef : public JavaRef<jobject> { | 90 class JavaRef : public JavaRef<jobject> { |
| 85 public: | 91 public: |
| 92 JavaRef(std::nullptr_t) : JavaRef<jobject>(nullptr) {} | |
| 93 ~JavaRef() {} | |
| 94 | |
| 86 T obj() const { return static_cast<T>(JavaRef<jobject>::obj()); } | 95 T obj() const { return static_cast<T>(JavaRef<jobject>::obj()); } |
| 87 | 96 |
| 88 protected: | 97 protected: |
| 89 JavaRef() {} | 98 JavaRef() {} |
| 90 ~JavaRef() {} | |
| 91 | 99 |
| 92 JavaRef(JNIEnv* env, T obj) : JavaRef<jobject>(env, obj) {} | 100 JavaRef(JNIEnv* env, T obj) : JavaRef<jobject>(env, obj) {} |
| 93 | 101 |
| 94 private: | 102 private: |
| 95 DISALLOW_COPY_AND_ASSIGN(JavaRef); | 103 DISALLOW_COPY_AND_ASSIGN(JavaRef); |
| 96 }; | 104 }; |
| 97 | 105 |
| 98 // Holds a local reference to a JNI method parameter. | 106 // Holds a local reference to a JNI method parameter. |
| 99 // Method parameters should not be deleted, and so this class exists purely to | 107 // Method parameters should not be deleted, and so this class exists purely to |
| 100 // wrap them as a JavaRef<T> in the JNI binding generator. Do not create | 108 // wrap them as a JavaRef<T> in the JNI binding generator. Do not create |
| 101 // instances manually. | 109 // instances manually. |
| 102 template<typename T> | 110 template<typename T> |
| 103 class JavaParamRef : public JavaRef<T> { | 111 class JavaParamRef : public JavaRef<T> { |
| 104 public: | 112 public: |
| 105 // Assumes that |obj| is a parameter passed to a JNI method from Java. | 113 // Assumes that |obj| is a parameter passed to a JNI method from Java. |
| 106 // Does not assume ownership as parameters should not be deleted. | 114 // Does not assume ownership as parameters should not be deleted. |
| 107 JavaParamRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj) {} | 115 JavaParamRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj) {} |
| 108 | 116 |
| 109 // Allow nullptr to be converted to JavaParamRef. Some unit tests call JNI | 117 // Allow nullptr to be converted to JavaParamRef. Some unit tests call JNI |
| 110 // methods directly from C++ and pass null for objects which are not actually | 118 // methods directly from C++ and pass null for objects which are not actually |
| 111 // used by the implementation (e.g. the caller object); allow this to keep | 119 // used by the implementation (e.g. the caller object); allow this to keep |
| 112 // working. | 120 // working. |
| 113 JavaParamRef(std::nullptr_t) : JavaRef<T>() {} | 121 JavaParamRef(std::nullptr_t) : JavaRef<T>(nullptr) {} |
| 114 | 122 |
| 115 ~JavaParamRef() {} | 123 ~JavaParamRef() {} |
| 116 | 124 |
| 117 // TODO(torne): remove this cast once we're using JavaRef consistently. | 125 // TODO(torne): remove this cast once we're using JavaRef consistently. |
| 118 // http://crbug.com/506850 | 126 // http://crbug.com/506850 |
| 119 operator T() const { return JavaRef<T>::obj(); } | 127 operator T() const { return JavaRef<T>::obj(); } |
| 120 | 128 |
| 121 private: | 129 private: |
| 122 DISALLOW_COPY_AND_ASSIGN(JavaParamRef); | 130 DISALLOW_COPY_AND_ASSIGN(JavaParamRef); |
| 123 }; | 131 }; |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 260 // is *not* a transfer of ownership and Release() should not be used. | 268 // is *not* a transfer of ownership and Release() should not be used. |
| 261 T Release() { | 269 T Release() { |
| 262 return static_cast<T>(this->ReleaseInternal()); | 270 return static_cast<T>(this->ReleaseInternal()); |
| 263 } | 271 } |
| 264 }; | 272 }; |
| 265 | 273 |
| 266 } // namespace android | 274 } // namespace android |
| 267 } // namespace base | 275 } // namespace base |
| 268 | 276 |
| 269 #endif // BASE_ANDROID_SCOPED_JAVA_REF_H_ | 277 #endif // BASE_ANDROID_SCOPED_JAVA_REF_H_ |
| OLD | NEW |