Skip to content

Commit 6cc4c32

Browse files
Googlera-maurice
authored andcommitted
Initial implementation of the FTL game SDK for Android (C++)
Implementation of the API for Firebase Test Lab Game Loops in C++. Gathers game loop data from the Android SDK via JNI calls. Currently, the app is exited by killing the thread with a call to exit(). This worked locally, but isn't the proper way to exit a native app. Simply finishing the activity puts the app in a bad state where it can't be started again. Also, custom results are currently unformatted. WANT_LGTM=smiles #FTLGameSDK PiperOrigin-RevId: 291940340
1 parent c297643 commit 6cc4c32

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

app/src/util_android.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,12 +182,17 @@ METHOD_LOOKUP_DEFINITION(resources, "android/content/res/Resources",
182182

183183
METHOD_LOOKUP_DEFINITION(activity, "android/app/Activity", ACTIVITY_METHODS)
184184
METHOD_LOOKUP_DEFINITION(array_list, "java/util/ArrayList", ARRAY_LIST_METHODS)
185+
METHOD_LOOKUP_DEFINITION(asset_file_descriptor,
186+
"android/content/res/AssetFileDescriptor",
187+
ASSETFILEDESCRIPTOR_METHODS)
185188
METHOD_LOOKUP_DEFINITION(boolean_class, "java/lang/Boolean", BOOLEAN_METHODS)
186189
METHOD_LOOKUP_DEFINITION(bundle, "android/os/Bundle", BUNDLE_METHODS)
187190
METHOD_LOOKUP_DEFINITION(byte_class, "java/lang/Byte", BYTE_METHODS)
188191
METHOD_LOOKUP_DEFINITION(character_class, "java/lang/Character",
189192
CHARACTER_METHODS);
190193
METHOD_LOOKUP_DEFINITION(class_class, "java/lang/Class", CLASS_METHODS)
194+
METHOD_LOOKUP_DEFINITION(content_resolver, "android/content/ContentResolver",
195+
CONTENTRESOLVER_METHODS)
191196
METHOD_LOOKUP_DEFINITION(context, "android/content/Context", CONTEXT_METHODS)
192197
METHOD_LOOKUP_DEFINITION(date, "java/util/Date", DATE_METHODS);
193198
METHOD_LOOKUP_DEFINITION(double_class, "java/lang/Double", DOUBLE_METHODS)
@@ -201,6 +206,9 @@ METHOD_LOOKUP_DEFINITION(iterator, "java/util/Iterator", ITERATOR_METHODS)
201206
METHOD_LOOKUP_DEFINITION(list, "java/util/List", LIST_METHODS)
202207
METHOD_LOOKUP_DEFINITION(long_class, "java/lang/Long", LONG_METHODS)
203208
METHOD_LOOKUP_DEFINITION(map, "java/util/Map", MAP_METHODS)
209+
METHOD_LOOKUP_DEFINITION(parcel_file_descriptor,
210+
"android/os/ParcelFileDescriptor",
211+
PARCELFILEDESCRIPTOR_METHODS)
204212
METHOD_LOOKUP_DEFINITION(set, "java/util/Set", SET_METHODS)
205213
METHOD_LOOKUP_DEFINITION(short_class, "java/lang/Short", SHORT_METHODS);
206214
METHOD_LOOKUP_DEFINITION(string, "java/lang/String", STRING_METHODS)
@@ -355,12 +363,14 @@ class ScopedCleanup {
355363

356364
// Release cached classes.
357365
static void ReleaseClasses(JNIEnv* env) {
366+
asset_file_descriptor::ReleaseClass(env);
358367
array_list::ReleaseClass(env);
359368
boolean_class::ReleaseClass(env);
360369
bundle::ReleaseClass(env);
361370
byte_class::ReleaseClass(env);
362371
character_class::ReleaseClass(env);
363372
class_class::ReleaseClass(env);
373+
content_resolver::ReleaseClass(env);
364374
context::ReleaseClass(env);
365375
date::ReleaseClass(env);
366376
dex_class_loader::ReleaseClass(env);
@@ -377,6 +387,7 @@ static void ReleaseClasses(JNIEnv* env) {
377387
long_class::ReleaseClass(env);
378388
list::ReleaseClass(env);
379389
map::ReleaseClass(env);
390+
parcel_file_descriptor::ReleaseClass(env);
380391
resources::ReleaseClass(env);
381392
set::ReleaseClass(env);
382393
short_class::ReleaseClass(env);
@@ -449,11 +460,13 @@ bool Initialize(JNIEnv* env, jobject activity_object) {
449460

450461
// Cache method pointers.
451462
if (!(array_list::CacheMethodIds(env, activity_object) &&
463+
asset_file_descriptor::CacheMethodIds(env, activity_object) &&
452464
boolean_class::CacheMethodIds(env, activity_object) &&
453465
bundle::CacheMethodIds(env, activity_object) &&
454466
byte_class::CacheMethodIds(env, activity_object) &&
455467
character_class::CacheMethodIds(env, activity_object) &&
456468
class_class::CacheMethodIds(env, activity_object) &&
469+
content_resolver::CacheMethodIds(env, activity_object) &&
457470
context::CacheMethodIds(env, activity_object) &&
458471
date::CacheMethodIds(env, activity_object) &&
459472
dex_class_loader::CacheMethodIds(env, activity_object) &&
@@ -469,6 +482,7 @@ bool Initialize(JNIEnv* env, jobject activity_object) {
469482
list::CacheMethodIds(env, activity_object) &&
470483
long_class::CacheMethodIds(env, activity_object) &&
471484
map::CacheMethodIds(env, activity_object) &&
485+
parcel_file_descriptor::CacheMethodIds(env, activity_object) &&
472486
resources::CacheMethodIds(env, activity_object) &&
473487
set::CacheMethodIds(env, activity_object) &&
474488
short_class::CacheMethodIds(env, activity_object) &&

app/src/util_android.h

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,9 @@ bool LookupFieldIds(JNIEnv* env, jclass clazz,
476476
X(GetIntent, "getIntent", "()Landroid/content/Intent;"), \
477477
X(GetPackageName, "getPackageName", "()Ljava/lang/String;"), \
478478
X(GetResources, "getResources", "()Landroid/content/res/Resources;"), \
479+
X(Finish, "finish", "()V"), \
480+
X(GetContentResolver, "getContentResolver", \
481+
"()Landroid/content/ContentResolver;"), \
479482
X(GetString, "getString", "(I)Ljava/lang/String;")
480483
#if !defined(FIREBASE_ANDROID_FOR_DESKTOP)
481484
#define ACTIVITY_METHODS(X) \
@@ -524,8 +527,8 @@ METHOD_LOOKUP_DECLARATION(iterator, ITERATOR_METHODS)
524527
// clang-format on
525528
METHOD_LOOKUP_DECLARATION(iterable, ITERABLE_METHODS)
526529

527-
// Used to setup the cache of Set class method IDs to reduce time spent looking
528-
// up methods by string.
530+
// Used to setup the cache of Set class method IDs to reduce time spent
531+
// looking up methods by string.
529532
// clang-format off
530533
#define SET_METHODS(X) \
531534
X(Iterator, "iterator", "()Ljava/util/Iterator;")
@@ -557,6 +560,7 @@ METHOD_LOOKUP_DECLARATION(array_list, ARRAY_LIST_METHODS)
557560
X(PutExtraString, "putExtra", \
558561
"(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;"), \
559562
X(GetExtras, "getExtras", "()Landroid/os/Bundle;"), \
563+
X(GetIntExtra, "getIntExtra", "(Ljava/lang/String;I)I"), \
560564
X(GetData, "getData", "()Landroid/net/Uri;")
561565
// clang-format on
562566
METHOD_LOOKUP_DECLARATION(intent, INTENT_METHODS);
@@ -687,6 +691,27 @@ METHOD_LOOKUP_DECLARATION(uri, URI_METHODS)
687691
// clang-format on
688692
METHOD_LOOKUP_DECLARATION(object, OBJECT_METHODS)
689693

694+
// clang-format off
695+
#define CONTENTRESOLVER_METHODS(X) \
696+
X(OpenAssetFileDescriptor, "openAssetFileDescriptor", \
697+
"(Landroid/net/Uri;Ljava/lang/String;)" \
698+
"Landroid/content/res/AssetFileDescriptor;")
699+
// clang-format on
700+
METHOD_LOOKUP_DECLARATION(content_resolver, CONTENTRESOLVER_METHODS)
701+
702+
// clang-format off
703+
#define ASSETFILEDESCRIPTOR_METHODS(X) \
704+
X(GetParcelFileDescriptor, "getParcelFileDescriptor", \
705+
"()Landroid/os/ParcelFileDescriptor;")
706+
// clang-format on
707+
METHOD_LOOKUP_DECLARATION(asset_file_descriptor, ASSETFILEDESCRIPTOR_METHODS)
708+
//
709+
// clang-format off
710+
#define PARCELFILEDESCRIPTOR_METHODS(X) \
711+
X(DetachFd, "detachFd", "()I")
712+
// clang-format on
713+
METHOD_LOOKUP_DECLARATION(parcel_file_descriptor, PARCELFILEDESCRIPTOR_METHODS)
714+
690715
// Holds a reference to a Java thread that will execute a C++ method.
691716
//
692717
// To support cancelation (i.e. using ReleaseExecuteCancelLock() and

0 commit comments

Comments
 (0)