Skip to content

Commit 78a90d6

Browse files
smilesa-maurice
authored andcommitted
Moved JObjectReference out of util_android.{cc,h}
PiperOrigin-RevId: 266024720
1 parent d6b98d8 commit 78a90d6

File tree

6 files changed

+238
-157
lines changed

6 files changed

+238
-157
lines changed

app/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ build_flatbuffers("${CMAKE_CURRENT_LIST_DIR}/google_services.fbs"
8585
set(log_common_SRCS
8686
src/log.cc)
8787
set(log_android_SRCS
88+
src/jobject_reference.cc
8889
src/log_android.cc
8990
src/log_android_callback.cc
9091
src/util_android.cc)

app/src/app_android.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "app/src/google_play_services/availability_android.h"
2525
#include "app/src/include/firebase/app.h"
2626
#include "app/src/include/firebase/version.h"
27+
#include "app/src/jobject_reference.h"
2728
#include "app/src/log.h"
2829
#include "app/src/util.h"
2930
#include "app/src/util_android.h"

app/src/jobject_reference.cc

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*
2+
* Copyright 2019 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#include "app/src/jobject_reference.h"
18+
19+
#include <jni.h>
20+
21+
#include "app/src/assert.h"
22+
// util_android.h is included for GetThreadsafeJNIEnv()
23+
#include "app/src/util_android.h"
24+
25+
namespace FIREBASE_NAMESPACE {
26+
namespace internal {
27+
28+
JObjectReference::JObjectReference() : java_vm_(nullptr), object_(nullptr) {}
29+
30+
JObjectReference::JObjectReference(JNIEnv* env)
31+
: java_vm_(GetJavaVM(env)), object_(nullptr) {}
32+
33+
JObjectReference::JObjectReference(JNIEnv* env, jobject object) {
34+
Initialize(GetJavaVM(env), env, object);
35+
}
36+
37+
JObjectReference::JObjectReference(const JObjectReference& reference) {
38+
Initialize(reference.java_vm_, reference.GetJNIEnv(), reference.object());
39+
}
40+
41+
#ifdef FIREBASE_USE_MOVE_OPERATORS
42+
JObjectReference::JObjectReference(JObjectReference&& reference) {
43+
operator=(std::move(reference));
44+
}
45+
#endif // FIREBASE_USE_MOVE_OPERATORS
46+
47+
JObjectReference::~JObjectReference() { Set(nullptr); }
48+
49+
JObjectReference& JObjectReference::operator=(
50+
const JObjectReference& reference) {
51+
Set(reference.GetJNIEnv(), reference.object_);
52+
return *this;
53+
}
54+
55+
#ifdef FIREBASE_USE_MOVE_OPERATORS
56+
JObjectReference& JObjectReference::operator=(JObjectReference&& reference) {
57+
java_vm_ = reference.java_vm_;
58+
object_ = reference.object_;
59+
reference.java_vm_ = nullptr;
60+
reference.object_ = nullptr;
61+
return *this;
62+
}
63+
#endif // FIREBASE_USE_MOVE_OPERATORS
64+
65+
void JObjectReference::Set(jobject jobject_reference) {
66+
JNIEnv* env = GetJNIEnv();
67+
if (env && object_) env->DeleteGlobalRef(object_);
68+
object_ = nullptr;
69+
Initialize(java_vm_, env, jobject_reference);
70+
}
71+
72+
void JObjectReference::Set(JNIEnv* env, jobject jobject_reference) {
73+
if (env && object_) env->DeleteGlobalRef(object_);
74+
object_ = nullptr;
75+
Initialize(GetJavaVM(env), env, jobject_reference);
76+
}
77+
78+
JNIEnv* JObjectReference::GetJNIEnv() const {
79+
return java_vm_ ? util::GetThreadsafeJNIEnv(java_vm_) : nullptr;
80+
}
81+
82+
jobject JObjectReference::GetLocalRef() const {
83+
JNIEnv* env = GetJNIEnv();
84+
return object_ && env ? env->NewLocalRef(object_) : nullptr;
85+
}
86+
87+
JObjectReference JObjectReference::FromLocalReference(JNIEnv* env,
88+
jobject local_reference) {
89+
JObjectReference jobject_reference = JObjectReference(env, local_reference);
90+
if (local_reference) env->DeleteLocalRef(local_reference);
91+
return jobject_reference;
92+
}
93+
94+
void JObjectReference::Initialize(JavaVM* jvm, JNIEnv* env,
95+
jobject jobject_reference) {
96+
FIREBASE_DEV_ASSERT(env || !jobject_reference);
97+
java_vm_ = jvm;
98+
object_ = nullptr;
99+
if (jobject_reference) object_ = env->NewGlobalRef(jobject_reference);
100+
}
101+
102+
JavaVM* JObjectReference::GetJavaVM(JNIEnv* env) {
103+
JavaVM* jvm;
104+
jint result = env->GetJavaVM(&jvm);
105+
assert(result == JNI_OK);
106+
return jvm;
107+
}
108+
109+
} // namespace internal
110+
} // namespace FIREBASE_NAMESPACE

app/src/jobject_reference.h

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/*
2+
* Copyright 2019 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
#ifndef FIREBASE_APP_CLIENT_CPP_SRC_JOBJECT_REFERENCE_H_
17+
#define FIREBASE_APP_CLIENT_CPP_SRC_JOBJECT_REFERENCE_H_
18+
19+
#include <jni.h>
20+
21+
#include "app/src/include/firebase/internal/common.h"
22+
23+
#if !defined(FIREBASE_NAMESPACE)
24+
#define FIREBASE_NAMESPACE firebase
25+
#endif
26+
27+
namespace FIREBASE_NAMESPACE {
28+
namespace internal {
29+
30+
// Creates an alias of internal::JObjectReference named classname.
31+
// This is useful when defining the implementation of a forward declared class
32+
// using JObjectReference.
33+
#define JOBJECT_REFERENCE(classname) \
34+
class classname : public FIREBASE_NAMESPACE::internal::JObjectReference { \
35+
public: \
36+
explicit classname(JNIEnv *env) : \
37+
FIREBASE_NAMESPACE::internal::JObjectReference(env) {} \
38+
explicit classname( \
39+
const FIREBASE_NAMESPACE::internal::JObjectReference& obj) : \
40+
FIREBASE_NAMESPACE::internal::JObjectReference(obj) {} \
41+
explicit classname( \
42+
FIREBASE_NAMESPACE::internal::JObjectReference&& obj) : \
43+
FIREBASE_NAMESPACE::internal::JObjectReference(obj) {} \
44+
classname(JNIEnv *env, jobject obj) : \
45+
FIREBASE_NAMESPACE::internal::JObjectReference(env, obj) {} \
46+
classname& operator=( \
47+
const FIREBASE_NAMESPACE::internal::JObjectReference& rhs) { \
48+
FIREBASE_NAMESPACE::internal::JObjectReference::operator=(rhs); \
49+
return *this; \
50+
} \
51+
classname& operator=( \
52+
FIREBASE_NAMESPACE::internal::JObjectReference&& rhs) { \
53+
FIREBASE_NAMESPACE::internal::JObjectReference::operator=(rhs); \
54+
return *this; \
55+
} \
56+
}
57+
58+
// Creates and holds a global reference to a Java object.
59+
class JObjectReference {
60+
public:
61+
JObjectReference();
62+
explicit JObjectReference(JNIEnv* env);
63+
// Create a reference to a java object.
64+
JObjectReference(JNIEnv* env, jobject object);
65+
// Copy
66+
JObjectReference(const JObjectReference& reference);
67+
// Move
68+
#ifdef FIREBASE_USE_MOVE_OPERATORS
69+
JObjectReference(JObjectReference&& reference);
70+
#endif // FIREBASE_USE_MOVE_OPERATORS
71+
// Delete the reference to the java object.
72+
~JObjectReference();
73+
// Copy this reference.
74+
JObjectReference& operator=(const JObjectReference& reference);
75+
// Move this reference.
76+
#ifdef FIREBASE_USE_MOVE_OPERATORS
77+
JObjectReference& operator=(JObjectReference&& reference);
78+
#endif // FIREBASE_USE_MOVE_OPERATORS
79+
80+
// Add a global reference to the specified object, removing the reference
81+
// to the object currently referenced by this class. If jobject_reference
82+
// is null, the existing reference is removed.
83+
void Set(jobject jobject_reference);
84+
85+
void Set(JNIEnv* env, jobject jobject_reference);
86+
87+
// Get a JNIEnv from the JavaVM associated with this class.
88+
JNIEnv* GetJNIEnv() const;
89+
90+
// Get the JavaVM associated with this class.
91+
JavaVM* java_vm() const { return java_vm_; }
92+
93+
// Get the global reference to the Java object without incrementing the
94+
// reference count.
95+
jobject object() const { return object_; }
96+
97+
// Get a local reference to the object. The returned reference must be
98+
// deleted after use with DeleteLocalRef().
99+
jobject GetLocalRef() const;
100+
101+
// Same as object()
102+
jobject operator*() const { return object(); }
103+
104+
// Convert a local reference to a JObjectReference, deleting the local
105+
// reference.
106+
static JObjectReference FromLocalReference(JNIEnv* env,
107+
jobject local_reference);
108+
109+
private:
110+
// Initialize this instance by adding a reference to the specified Java
111+
// object.
112+
void Initialize(JavaVM* jvm, JNIEnv* env, jobject jobject_reference);
113+
// Get JavaVM from a JNIEnv.
114+
static JavaVM* GetJavaVM(JNIEnv* env);
115+
116+
private:
117+
JavaVM* java_vm_;
118+
jobject object_;
119+
};
120+
121+
} // namespace internal
122+
} // namespace FIREBASE_NAMESPACE
123+
124+
#endif // FIREBASE_APP_CLIENT_CPP_SRC_JOBJECT_REFERENCE_H_

app/src/util_android.cc

Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,78 +1295,6 @@ JNIEXPORT void JNICALL JniResultCallback_nativeOnResult(
12951295
status_message_c.c_str(), user_callback_data);
12961296
}
12971297

1298-
JObjectReference::JObjectReference(JNIEnv* env)
1299-
: java_vm_(GetJavaVM(env)), object_(nullptr) {}
1300-
1301-
JObjectReference::JObjectReference(JNIEnv* env, jobject object) {
1302-
Initialize(GetJavaVM(env), env, object);
1303-
}
1304-
1305-
JObjectReference::JObjectReference(const JObjectReference& reference) {
1306-
Initialize(reference.java_vm_, reference.GetJNIEnv(), reference.object());
1307-
}
1308-
1309-
#ifdef FIREBASE_USE_MOVE_OPERATORS
1310-
JObjectReference::JObjectReference(JObjectReference&& reference) {
1311-
operator=(std::move(reference));
1312-
}
1313-
#endif // FIREBASE_USE_MOVE_OPERATORS
1314-
1315-
JObjectReference::~JObjectReference() { Set(nullptr); }
1316-
1317-
JObjectReference& JObjectReference::operator=(
1318-
const JObjectReference& reference) {
1319-
Set(reference.object_);
1320-
return *this;
1321-
}
1322-
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-
1331-
void JObjectReference::Set(jobject jobject_reference) {
1332-
JNIEnv* env = GetJNIEnv();
1333-
if (object_) {
1334-
env->DeleteGlobalRef(object_);
1335-
object_ = nullptr;
1336-
}
1337-
Initialize(java_vm_, env, jobject_reference);
1338-
}
1339-
1340-
JNIEnv* JObjectReference::GetJNIEnv() const {
1341-
return GetThreadsafeJNIEnv(java_vm_);
1342-
}
1343-
1344-
jobject JObjectReference::GetLocalRef() const {
1345-
JNIEnv* env = GetJNIEnv();
1346-
return object_ ? env->NewLocalRef(object_) : nullptr;
1347-
}
1348-
1349-
JObjectReference JObjectReference::FromLocalReference(JNIEnv* env,
1350-
jobject local_reference) {
1351-
JObjectReference jobject_reference = JObjectReference(env, local_reference);
1352-
if (local_reference) env->DeleteLocalRef(local_reference);
1353-
return jobject_reference;
1354-
}
1355-
1356-
void JObjectReference::Initialize(JavaVM* jvm, JNIEnv* env,
1357-
jobject jobject_reference) {
1358-
java_vm_ = jvm;
1359-
object_ = nullptr;
1360-
if (jobject_reference) object_ = env->NewGlobalRef(jobject_reference);
1361-
}
1362-
1363-
JavaVM* JObjectReference::GetJavaVM(JNIEnv* env) {
1364-
JavaVM* jvm;
1365-
jint result = env->GetJavaVM(&jvm);
1366-
assert(result == JNI_OK);
1367-
return jvm;
1368-
}
1369-
13701298
// Call a C++ function pointer, passing in a given data pointer. This is called
13711299
// by the CppThreadDispatcher Java class, which uses the Java long type to
13721300
// contain C++ pointers.

0 commit comments

Comments
 (0)