Skip to content

Commit a5f43f1

Browse files
smilesa-maurice
authored andcommitted
Added macro to generate aliases of JObjectReference.
It can be useful to forward declare a platform specific handle class e.g UserInternal and then define the class in terms of JObjectReference. For example... class UserInternal; class User { protected: UserInternal *internal; }; In Android specific code UserInternal can be declared using JOBJECT_REFERENCE(UserInternal); This removes the need to cast from void* to the platform specific type. PiperOrigin-RevId: 264715554
1 parent 2296ff3 commit a5f43f1

File tree

2 files changed

+68
-6
lines changed

2 files changed

+68
-6
lines changed

app/src/util_android.cc

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <map>
3030
#include <string>
3131
#include <vector>
32+
#include <utility>
3233

3334
#include "app/app_resources.h"
3435
#include "app/src/app_common.h"
@@ -1295,16 +1296,22 @@ JNIEXPORT void JNICALL JniResultCallback_nativeOnResult(
12951296
}
12961297

12971298
JObjectReference::JObjectReference(JNIEnv* env)
1298-
: jvm_(GetJavaVM(env)), object_(nullptr) {}
1299+
: java_vm_(GetJavaVM(env)), object_(nullptr) {}
12991300

13001301
JObjectReference::JObjectReference(JNIEnv* env, jobject object) {
13011302
Initialize(GetJavaVM(env), env, object);
13021303
}
13031304

13041305
JObjectReference::JObjectReference(const JObjectReference& reference) {
1305-
Initialize(reference.jvm_, reference.GetJNIEnv(), reference.object());
1306+
Initialize(reference.java_vm_, reference.GetJNIEnv(), reference.object());
13061307
}
13071308

1309+
#ifdef FIREBASE_USE_MOVE_OPERATORS
1310+
JObjectReference::JObjectReference(JObjectReference&& reference) {
1311+
operator=(std::move(reference));
1312+
}
1313+
#endif // FIREBASE_USE_MOVE_OPERATORS
1314+
13081315
JObjectReference::~JObjectReference() { Set(nullptr); }
13091316

13101317
JObjectReference& JObjectReference::operator=(
@@ -1313,17 +1320,30 @@ JObjectReference& JObjectReference::operator=(
13131320
return *this;
13141321
}
13151322

1323+
#ifdef FIREBASE_USE_MOVE_OPERATORS
1324+
JObjectReference& JObjectReference::operator=(JObjectReference&& reference) {
1325+
java_vm_ = reference.java_vm_;
1326+
object_ = reference.object_;
1327+
return *this;
1328+
}
1329+
#endif // FIREBASE_USE_MOVE_OPERATORS
1330+
13161331
void JObjectReference::Set(jobject jobject_reference) {
13171332
JNIEnv* env = GetJNIEnv();
13181333
if (object_) {
13191334
env->DeleteGlobalRef(object_);
13201335
object_ = nullptr;
13211336
}
1322-
Initialize(jvm_, env, jobject_reference);
1337+
Initialize(java_vm_, env, jobject_reference);
13231338
}
13241339

13251340
JNIEnv* JObjectReference::GetJNIEnv() const {
1326-
return GetThreadsafeJNIEnv(jvm_);
1341+
return GetThreadsafeJNIEnv(java_vm_);
1342+
}
1343+
1344+
jobject JObjectReference::GetLocalRef() const {
1345+
JNIEnv* env = GetJNIEnv();
1346+
return object_ ? env->NewLocalRef(object_) : nullptr;
13271347
}
13281348

13291349
JObjectReference JObjectReference::FromLocalReference(JNIEnv* env,
@@ -1335,7 +1355,7 @@ JObjectReference JObjectReference::FromLocalReference(JNIEnv* env,
13351355

13361356
void JObjectReference::Initialize(JavaVM* jvm, JNIEnv* env,
13371357
jobject jobject_reference) {
1338-
jvm_ = jvm;
1358+
java_vm_ = jvm;
13391359
object_ = nullptr;
13401360
if (jobject_reference) object_ = env->NewGlobalRef(jobject_reference);
13411361
}

app/src/util_android.h

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)