@@ -732,10 +732,18 @@ class JObjectReference {
732732 JObjectReference (JNIEnv* env, jobject object);
733733 // Copy
734734 JObjectReference (const JObjectReference& reference);
735+ // Move
736+ #ifdef FIREBASE_USE_MOVE_OPERATORS
737+ JObjectReference (JObjectReference&& reference);
738+ #endif // FIREBASE_USE_MOVE_OPERATORS
735739 // Delete the reference to the java object.
736740 ~JObjectReference ();
737741 // Copy this reference.
738742 JObjectReference& operator =(const JObjectReference& reference);
743+ // Move this reference.
744+ #ifdef FIREBASE_USE_MOVE_OPERATORS
745+ JObjectReference& operator =(JObjectReference&& reference);
746+ #endif // FIREBASE_USE_MOVE_OPERATORS
739747
740748 // Add a global reference to the specified object, removing the reference
741749 // to the object currently referenced by this class. If jobject_reference
@@ -745,10 +753,20 @@ class JObjectReference {
745753 // Get a JNIEnv from the JavaVM associated with this class.
746754 JNIEnv* GetJNIEnv () const ;
747755
756+ // Get the JavaVM associated with this class.
757+ JavaVM* java_vm () const { return java_vm_; }
758+
748759 // Get the global reference to the Java object without incrementing the
749760 // reference count.
750761 jobject object () const { return object_; }
751762
763+ // Get a local reference to the object. The returned reference must be
764+ // deleted after use with DeleteLocalRef().
765+ jobject GetLocalRef () const ;
766+
767+ // Same as object()
768+ jobject operator *() const { return object (); }
769+
752770 // Convert a local reference to a JObjectReference, deleting the local
753771 // reference.
754772 static JObjectReference FromLocalReference (JNIEnv* env,
@@ -762,10 +780,34 @@ class JObjectReference {
762780 static JavaVM* GetJavaVM (JNIEnv* env);
763781
764782 private:
765- JavaVM* jvm_ ;
783+ JavaVM* java_vm_ ;
766784 jobject object_;
767785};
768786
787+ // Creates an alias of util::JObjectReference named classname.
788+ // This is useful when defining the implementation of a forward declared class
789+ // using JObjectReference.
790+ #define JOBJECT_REFERENCE (classname ) \
791+ class classname : public firebase ::util::JObjectReference { \
792+ public: \
793+ explicit classname (JNIEnv *env) : \
794+ firebase::util::JObjectReference(env) {} \
795+ explicit classname (const firebase::util::JObjectReference& obj) : \
796+ firebase::util::JObjectReference(obj) {} \
797+ explicit classname (firebase::util::JObjectReference&& obj) : \
798+ firebase::util::JObjectReference(obj) {} \
799+ classname (JNIEnv *env, jobject obj) : \
800+ util::JObjectReference (env, obj) {} \
801+ classname& operator =(const util::JObjectReference& rhs) { \
802+ util::JObjectReference::operator =(rhs); \
803+ return *this ; \
804+ } \
805+ classname& operator =(util::JObjectReference&& rhs) { \
806+ util::JObjectReference::operator =(rhs); \
807+ return *this ; \
808+ } \
809+ }
810+
769811// Holds a reference to a Java thread that will execute a C++ method.
770812//
771813// To support cancelation (i.e. using ReleaseExecuteCancelLock() and
0 commit comments