Index: base/android/scoped_java_ref.h |
diff --git a/base/android/scoped_java_ref.h b/base/android/scoped_java_ref.h |
index 37e7fd3507ca480ee29209df24d3e7e2cf2b7472..d6a81fa637f3b1214593f50d0a5d5e6989c42632 100644 |
--- a/base/android/scoped_java_ref.h |
+++ b/base/android/scoped_java_ref.h |
@@ -94,6 +94,27 @@ class JavaRef : public JavaRef<jobject> { |
DISALLOW_COPY_AND_ASSIGN(JavaRef); |
}; |
+// Holds a local reference to a JNI method parameter. |
+// Method parameters should not be deleted, and so this class exists purely to |
+// wrap them as a JavaRef<T> in the JNI binding generator. Do not create |
+// instances manually. |
+template<typename T> |
+class JavaParamRef : public JavaRef<T> { |
+ public: |
+ // Assumes that |obj| is a parameter passed to a JNI method from Java. |
+ // Does not assume ownership as parameters should not be deleted. |
+ JavaParamRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj) {} |
+ |
+ ~JavaParamRef() {} |
+ |
+ // TODO(torne): remove this cast once we're using JavaRef consistently. |
+ // http://crbug.com/506850 |
+ operator T() const { return JavaRef<T>::obj(); } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(JavaParamRef); |
+}; |
+ |
// Holds a local reference to a Java object. The local reference is scoped |
// to the lifetime of this object. |
// Instances of this class may hold onto any JNIEnv passed into it until |
@@ -208,6 +229,11 @@ class ScopedJavaGlobalRef : public JavaRef<T> { |
} |
template<typename U> |
+ void Reset(JNIEnv* env, const JavaParamRef<U>& other) { |
+ this->Reset(env, other.obj()); |
+ } |
+ |
+ template<typename U> |
void Reset(JNIEnv* env, U obj) { |
implicit_cast<T>(obj); // Ensure U is assignable to T |
this->SetNewGlobalRef(env, obj); |