Merge "Nativehelper: Fix ScopedLocalRef" am: 7afb45427e am: 727c2c03c8 am: 2f1df33912
am: 11be1ee1cf

Change-Id: I434f3c6f9d01c25982ab6563ddf4ff6ac1a31bf7
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);