Skip to content

Commit be955c6

Browse files
wilhuffa-maurice
authored andcommitted
Finish conversion of TransactionInternal to the new JNI framework
PiperOrigin-RevId: 334459761
1 parent 66887d6 commit be955c6

File tree

4 files changed

+57
-124
lines changed

4 files changed

+57
-124
lines changed

firestore/src/android/firestore_android.cc

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,7 @@ bool FirestoreInternal::Initialize(App* app) {
174174
loader.CacheEmbeddedFiles();
175175

176176
if (!( // Call Initialize on each Firestore internal class.
177-
FieldValueInternal::Initialize(app) &&
178-
TransactionInternal::Initialize(app) && Wrapper::Initialize(app) &&
179-
// Initialize those embedded Firestore internal classes.
180-
InitializeEmbeddedClasses(app, loader))) {
177+
FieldValueInternal::Initialize(app) && Wrapper::Initialize(app))) {
181178
ReleaseClasses(app);
182179
return false;
183180
}
@@ -214,6 +211,7 @@ bool FirestoreInternal::Initialize(App* app) {
214211
SnapshotMetadataInternal::Initialize(loader);
215212
SourceInternal::Initialize(loader);
216213
TimestampInternal::Initialize(loader);
214+
TransactionInternal::Initialize(loader);
217215
WriteBatchInternal::Initialize(loader);
218216
if (!loader.ok()) {
219217
ReleaseClasses(app);
@@ -227,22 +225,13 @@ bool FirestoreInternal::Initialize(App* app) {
227225
return true;
228226
}
229227

230-
/* static */
231-
bool FirestoreInternal::InitializeEmbeddedClasses(App* app, Loader& loader) {
232-
// Terminate() handles tearing this down.
233-
// Load embedded classes.
234-
return TransactionInternal::InitializeEmbeddedClasses(
235-
app, loader.embedded_files());
236-
}
237-
238228
/* static */
239229
void FirestoreInternal::ReleaseClasses(App* app) {
240230
delete loader_;
241231
loader_ = nullptr;
242232

243233
// Call Terminate on each Firestore internal class.
244234
FieldValueInternal::Terminate(app);
245-
TransactionInternal::Terminate(app);
246235
Wrapper::Terminate(app);
247236
}
248237

firestore/src/android/firestore_android.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,6 @@ class FirestoreInternal {
197197
static void ReleaseClasses(App* app);
198198
static void Terminate(App* app);
199199

200-
// Initialize classes loaded from embedded files.
201-
static bool InitializeEmbeddedClasses(App* app, jni::Loader& loader);
202-
203200
static Mutex init_mutex_;
204201
static int initialize_count_;
205202
static jni::Loader* loader_;

firestore/src/android/transaction_android.cc

Lines changed: 53 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -5,78 +5,86 @@
55
#include <utility>
66

77
#include "app/meta/move.h"
8-
#include "app/src/embedded_file.h"
98
#include "app/src/include/firebase/internal/common.h"
10-
#include "app/src/util_android.h"
119
#include "firestore/src/android/document_reference_android.h"
1210
#include "firestore/src/android/exception_android.h"
1311
#include "firestore/src/android/field_path_android.h"
1412
#include "firestore/src/android/field_value_android.h"
1513
#include "firestore/src/android/set_options_android.h"
1614
#include "firestore/src/jni/env.h"
1715
#include "firestore/src/jni/hash_map.h"
16+
#include "firestore/src/jni/loader.h"
1817

1918
namespace firebase {
2019
namespace firestore {
2120
namespace {
2221

22+
using jni::Constructor;
2323
using jni::Env;
2424
using jni::HashMap;
2525
using jni::Local;
26+
using jni::Method;
2627
using jni::Object;
2728
using jni::Throwable;
2829

30+
constexpr char kTransactionClassName[] =
31+
PROGUARD_KEEP_CLASS "com/google/firebase/firestore/Transaction";
32+
Method<Object> kSet(
33+
"set",
34+
"(Lcom/google/firebase/firestore/DocumentReference;Ljava/lang/Object;"
35+
"Lcom/google/firebase/firestore/SetOptions;)"
36+
"Lcom/google/firebase/firestore/Transaction;");
37+
Method<Object> kUpdate(
38+
"update",
39+
"(Lcom/google/firebase/firestore/DocumentReference;Ljava/util/Map;)"
40+
"Lcom/google/firebase/firestore/Transaction;");
41+
Method<Object> kUpdateVarargs(
42+
"update",
43+
"(Lcom/google/firebase/firestore/DocumentReference;"
44+
"Lcom/google/firebase/firestore/FieldPath;Ljava/lang/Object;"
45+
"[Ljava/lang/Object;)Lcom/google/firebase/firestore/Transaction;");
46+
Method<Object> kDelete("delete",
47+
"(Lcom/google/firebase/firestore/DocumentReference;)"
48+
"Lcom/google/firebase/firestore/Transaction;");
49+
Method<Object> kGet("get",
50+
"(Lcom/google/firebase/firestore/DocumentReference;)"
51+
"Lcom/google/firebase/firestore/DocumentSnapshot;");
52+
53+
constexpr char kTransactionFunctionClassName[] = PROGUARD_KEEP_CLASS
54+
"com/google/firebase/firestore/internal/cpp/TransactionFunction";
55+
56+
Constructor<Object> kNewTransactionFunction("(JJ)V");
57+
2958
} // namespace
3059

31-
// clang-format off
32-
#define TRANSACTION_METHODS(X) \
33-
X(Set, "set", \
34-
"(Lcom/google/firebase/firestore/DocumentReference;Ljava/lang/Object;" \
35-
"Lcom/google/firebase/firestore/SetOptions;)" \
36-
"Lcom/google/firebase/firestore/Transaction;"), \
37-
X(Update, "update", \
38-
"(Lcom/google/firebase/firestore/DocumentReference;Ljava/util/Map;)" \
39-
"Lcom/google/firebase/firestore/Transaction;"), \
40-
X(UpdateVarargs, "update", \
41-
"(Lcom/google/firebase/firestore/DocumentReference;" \
42-
"Lcom/google/firebase/firestore/FieldPath;Ljava/lang/Object;" \
43-
"[Ljava/lang/Object;)Lcom/google/firebase/firestore/Transaction;"), \
44-
X(Delete, "delete", "(Lcom/google/firebase/firestore/DocumentReference;)" \
45-
"Lcom/google/firebase/firestore/Transaction;"), \
46-
X(Get, "get", "(Lcom/google/firebase/firestore/DocumentReference;)" \
47-
"Lcom/google/firebase/firestore/DocumentSnapshot;")
48-
// clang-format on
49-
50-
METHOD_LOOKUP_DECLARATION(transaction, TRANSACTION_METHODS)
51-
METHOD_LOOKUP_DEFINITION(transaction,
52-
PROGUARD_KEEP_CLASS
53-
"com/google/firebase/firestore/Transaction",
54-
TRANSACTION_METHODS)
55-
56-
#define TRANSACTION_FUNCTION_METHODS(X) X(Constructor, "<init>", "(JJ)V")
57-
METHOD_LOOKUP_DECLARATION(transaction_function, TRANSACTION_FUNCTION_METHODS)
58-
METHOD_LOOKUP_DEFINITION(
59-
transaction_function,
60-
PROGUARD_KEEP_CLASS
61-
"com/google/firebase/firestore/internal/cpp/TransactionFunction",
62-
TRANSACTION_FUNCTION_METHODS)
60+
void TransactionInternal::Initialize(jni::Loader& loader) {
61+
loader.LoadClass(kTransactionClassName, kSet, kUpdate, kUpdateVarargs,
62+
kDelete, kGet);
63+
64+
static const JNINativeMethod kTransactionFunctionNatives[] = {
65+
{"nativeApply",
66+
"(JJLcom/google/firebase/firestore/Transaction;)Ljava/lang/Exception;",
67+
reinterpret_cast<void*>(
68+
&TransactionInternal::TransactionFunctionNativeApply)}};
69+
loader.LoadClass(kTransactionFunctionClassName, kNewTransactionFunction);
70+
loader.RegisterNatives(kTransactionFunctionNatives,
71+
FIREBASE_ARRAYSIZE(kTransactionFunctionNatives));
72+
}
6373

6474
void TransactionInternal::Set(const DocumentReference& document,
6575
const MapFieldValue& data,
6676
const SetOptions& options) {
6777
Env env = GetEnv();
6878
Local<HashMap> java_data = MakeJavaMap(env, data);
6979
Local<Object> java_options = SetOptionsInternal::Create(env, options);
70-
env.Call<Object>(obj_, transaction::GetMethodId(transaction::kSet),
71-
document.internal_->ToJava(), java_data, java_options);
80+
env.Call(obj_, kSet, document.internal_->ToJava(), java_data, java_options);
7281
}
7382

7483
void TransactionInternal::Update(const DocumentReference& document,
7584
const MapFieldValue& data) {
7685
Env env = GetEnv();
7786
Local<HashMap> java_data = MakeJavaMap(env, data);
78-
env.Call<Object>(obj_, transaction::GetMethodId(transaction::kUpdate),
79-
document.internal_->ToJava(), java_data);
87+
env.Call(obj_, kUpdate, document.internal_->ToJava(), java_data);
8088
}
8189

8290
void TransactionInternal::Update(const DocumentReference& document,
@@ -88,25 +96,21 @@ void TransactionInternal::Update(const DocumentReference& document,
8896

8997
Env env = GetEnv();
9098
UpdateFieldPathArgs args = MakeUpdateFieldPathArgs(env, data);
91-
env.Call<Object>(obj_, transaction::GetMethodId(transaction::kUpdateVarargs),
92-
document.internal_->ToJava(), args.first_field,
93-
args.first_value, args.varargs);
99+
env.Call(obj_, kUpdateVarargs, document.internal_->ToJava(), args.first_field,
100+
args.first_value, args.varargs);
94101
}
95102

96103
void TransactionInternal::Delete(const DocumentReference& document) {
97104
Env env = GetEnv();
98-
env.Call<Object>(obj_, transaction::GetMethodId(transaction::kDelete),
99-
document.internal_->ToJava());
105+
env.Call(obj_, kDelete, document.internal_->ToJava());
100106
}
101107

102108
DocumentSnapshot TransactionInternal::Get(const DocumentReference& document,
103109
Error* error_code,
104110
std::string* error_message) {
105111
Env env = GetEnv();
106112

107-
Local<Object> snapshot =
108-
env.Call<Object>(obj_, transaction::GetMethodId(transaction::kGet),
109-
document.internal_->ToJava());
113+
Local<Object> snapshot = env.Call(obj_, kGet, document.internal_->ToJava());
110114
Local<Throwable> exception = env.ClearExceptionOccurred();
111115

112116
if (exception) {
@@ -172,22 +176,10 @@ Local<Throwable> TransactionInternal::ClearExceptionOccurred() {
172176
Local<Object> TransactionInternal::Create(Env& env,
173177
FirestoreInternal* firestore,
174178
TransactionFunction* function) {
175-
return Local<Object>(env.get(), ToJavaObject(env.get(), firestore, function));
176-
}
177-
178-
/* static */
179-
jobject TransactionInternal::ToJavaObject(JNIEnv* env,
180-
FirestoreInternal* firestore,
181-
TransactionFunction* function) {
182-
jobject result = env->NewObject(
183-
transaction_function::GetClass(),
184-
transaction_function::GetMethodId(transaction_function::kConstructor),
185-
reinterpret_cast<jlong>(firestore), reinterpret_cast<jlong>(function));
186-
util::CheckAndClearJniExceptions(env);
187-
return result;
179+
return env.New(kNewTransactionFunction, reinterpret_cast<jlong>(firestore),
180+
reinterpret_cast<jlong>(function));
188181
}
189182

190-
/* static */
191183
jobject TransactionInternal::TransactionFunctionNativeApply(
192184
JNIEnv* raw_env, jclass clazz, jlong firestore_ptr,
193185
jlong transaction_function_ptr, jobject java_transaction) {
@@ -200,7 +192,7 @@ jobject TransactionInternal::TransactionFunctionNativeApply(
200192
TransactionFunction* transaction_function =
201193
reinterpret_cast<TransactionFunction*>(transaction_function_ptr);
202194

203-
Transaction transaction(new TransactionInternal{firestore, java_transaction});
195+
Transaction transaction(new TransactionInternal(firestore, java_transaction));
204196

205197
std::string message;
206198
Error code = transaction_function->Apply(transaction, message);
@@ -216,42 +208,5 @@ jobject TransactionInternal::TransactionFunctionNativeApply(
216208
}
217209
}
218210

219-
/* static */
220-
bool TransactionInternal::Initialize(App* app) {
221-
JNIEnv* env = app->GetJNIEnv();
222-
jobject activity = app->activity();
223-
bool result = transaction::CacheMethodIds(env, activity);
224-
util::CheckAndClearJniExceptions(env);
225-
return result;
226-
}
227-
228-
/* static */
229-
bool TransactionInternal::InitializeEmbeddedClasses(
230-
App* app, const std::vector<internal::EmbeddedFile>* embedded_files) {
231-
static const JNINativeMethod kTransactionFunctionNatives[] = {
232-
{"nativeApply",
233-
"(JJLcom/google/firebase/firestore/Transaction;)Ljava/lang/Exception;",
234-
reinterpret_cast<void*>(
235-
&TransactionInternal::TransactionFunctionNativeApply)}};
236-
JNIEnv* env = app->GetJNIEnv();
237-
jobject activity = app->activity();
238-
bool result = transaction_function::CacheClassFromFiles(env, activity,
239-
embedded_files) &&
240-
transaction_function::CacheMethodIds(env, activity) &&
241-
transaction_function::RegisterNatives(
242-
env, kTransactionFunctionNatives,
243-
FIREBASE_ARRAYSIZE(kTransactionFunctionNatives));
244-
util::CheckAndClearJniExceptions(env);
245-
return result;
246-
}
247-
248-
/* static */
249-
void TransactionInternal::Terminate(App* app) {
250-
JNIEnv* env = app->GetJNIEnv();
251-
transaction::ReleaseClass(env);
252-
transaction_function::ReleaseClass(env);
253-
util::CheckAndClearJniExceptions(env);
254-
}
255-
256211
} // namespace firestore
257212
} // namespace firebase

firestore/src/android/transaction_android.h

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class TransactionInternal : public Wrapper {
2121
public:
2222
using ApiType = Transaction;
2323

24+
static void Initialize(jni::Loader& loader);
25+
2426
TransactionInternal(FirestoreInternal* firestore, jobject obj)
2527
: Wrapper(firestore, obj),
2628
first_exception_(MakeShared<jni::Local<jni::Throwable>>()) {}
@@ -48,9 +50,6 @@ class TransactionInternal : public Wrapper {
4850
FirestoreInternal* firestore,
4951
TransactionFunction* function);
5052

51-
static jobject ToJavaObject(JNIEnv* env, FirestoreInternal* firestore,
52-
TransactionFunction* function);
53-
5453
static jobject TransactionFunctionNativeApply(JNIEnv* env, jclass clazz,
5554
jlong firestore_ptr,
5655
jlong transaction_function_ptr,
@@ -70,13 +69,6 @@ class TransactionInternal : public Wrapper {
7069
// Returns and clears the global reference of the first exception, if any.
7170
jni::Local<jni::Throwable> ClearExceptionOccurred();
7271

73-
friend class FirestoreInternal;
74-
75-
static bool Initialize(App* app);
76-
static bool InitializeEmbeddedClasses(
77-
App* app, const std::vector<internal::EmbeddedFile>* embedded_files);
78-
static void Terminate(App* app);
79-
8072
// The first exception that occurred. Because exceptions must be cleared
8173
// before calling other JNI methods, we cannot rely on the Java exception
8274
// mechanism to properly handle native calls via JNI. The first exception is

0 commit comments

Comments
 (0)