Merge "Nativehelper: Fix ScopedLocalRef"
am: 7afb45427e
Change-Id: Id2f4f62d4dbc31453819b5c13863d1b299566fa9
diff --git a/include/nativehelper/ScopedLocalRef.h b/include/nativehelper/ScopedLocalRef.h
index 73e39a9..4018f20 100644
--- a/include/nativehelper/ScopedLocalRef.h
+++ b/include/nativehelper/ScopedLocalRef.h
@@ -56,18 +56,21 @@
#if __cplusplus >= 201103L
// Move constructor.
ScopedLocalRef(ScopedLocalRef&& s) : mEnv(s.mEnv), mLocalRef(s.release()) {
- s.mEnv = nullptr;
}
- // Empty constructor now makes sense, as we can move-assign.
- ScopedLocalRef() : mEnv(nullptr), mLocalRef(nullptr) {
+ explicit ScopedLocalRef(JNIEnv* env) : mEnv(env), mLocalRef(nullptr) {
}
+ // We do not expose an empty constructor as it can easily lead to errors
+ // using common idioms, e.g.:
+ // ScopedLocalRef<...> ref;
+ // ref.reset(...);
+
// Move assignment operator.
ScopedLocalRef& operator=(ScopedLocalRef&& s) {
reset(s.release());
mEnv = s.mEnv;
- s.mEnv = nullptr;
+ return *this;
}
// Allows "if (scoped_ref == nullptr)"
@@ -82,7 +85,7 @@
#endif
private:
- JNIEnv* const mEnv;
+ JNIEnv* mEnv;
T mLocalRef;
DISALLOW_COPY_AND_ASSIGN(ScopedLocalRef);