1414 * limitations under the License.
1515 */
1616
17- #include " app/src/include/firebase/app.h"
18-
1917#include < jni.h>
2018#include < string.h>
19+
2120#include < string>
2221
2322#include " app/src/app_common.h"
2423#include " app/src/assert.h"
2524#include " app/src/google_play_services/availability_android.h"
25+ #include " app/src/include/firebase/app.h"
2626#include " app/src/include/firebase/version.h"
2727#include " app/src/log.h"
2828#include " app/src/util.h"
@@ -117,6 +117,26 @@ METHOD_LOOKUP_DEFINITION(options,
117117 " com/google/firebase/FirebaseOptions" ,
118118 FIREBASE_OPTIONS_METHODS)
119119
120+ // clang-format off
121+ #define GLOBAL_LIBRARY_VERSION_REGISTAR_METHODS (X ) \
122+ X (GetInstance, " getInstance" , \
123+ " ()Lcom/google/firebase/platforminfo/GlobalLibraryVersionRegistrar;" , \
124+ util::kMethodTypeStatic ), \
125+ X (RegisterVersion, " registerVersion" , \
126+ " (Ljava/lang/String;Ljava/lang/String;)V" , \
127+ util::kMethodTypeInstance ), \
128+ X (GetRegisteredVersions, " getRegisteredVersions" , " ()Ljava/util/Set;" , \
129+ util::kMethodTypeInstance )
130+ // clang-format on
131+
132+ METHOD_LOOKUP_DECLARATION (version_registrar,
133+ GLOBAL_LIBRARY_VERSION_REGISTAR_METHODS)
134+ METHOD_LOOKUP_DEFINITION (
135+ version_registrar,
136+ PROGUARD_KEEP_CLASS
137+ " com/google/firebase/platforminfo/GlobalLibraryVersionRegistrar" ,
138+ GLOBAL_LIBRARY_VERSION_REGISTAR_METHODS)
139+
120140const char * kDefaultAppName = " __FIRAPP_DEFAULT" ;
121141
122142namespace {
@@ -137,6 +157,7 @@ bool CacheMethods(JNIEnv* env, jobject activity) {
137157 if (!(app::CacheMethodIds (env, activity) &&
138158 options_builder::CacheMethodIds (env, activity) &&
139159 options::CacheMethodIds (env, activity) &&
160+ version_registrar::CacheMethodIds (env, activity) &&
140161 google_play_services::Initialize (env, activity))) {
141162 ReleaseClasses (env);
142163 return false ;
@@ -152,6 +173,7 @@ void ReleaseClasses(JNIEnv* env) {
152173 app::ReleaseClass (env);
153174 options_builder::ReleaseClass (env);
154175 options::ReleaseClass (env);
176+ version_registrar::ReleaseClass (env);
155177 google_play_services::Terminate (env);
156178 util::Terminate (env);
157179 }
@@ -410,7 +432,30 @@ App* App::GetInstance(const char* name) {
410432
411433JNIEnv* App::GetJNIEnv () const { return util::GetThreadsafeJNIEnv (java_vm ()); }
412434
435+ static void RegisterLibraryWithVersionRegistrar (JNIEnv* env,
436+ const char * library,
437+ const char * version) {
438+ jobject registrar = env->CallStaticObjectMethod (
439+ version_registrar::GetClass (),
440+ version_registrar::GetMethodId (version_registrar::kGetInstance ));
441+ util::CheckAndClearJniExceptions (env);
442+ FIREBASE_ASSERT (registrar != nullptr );
443+
444+ jstring library_string = env->NewStringUTF (library);
445+ jstring version_string = env->NewStringUTF (version);
446+ env->CallVoidMethod (
447+ registrar,
448+ version_registrar::GetMethodId (version_registrar::kRegisterVersion ),
449+ library_string, version_string);
450+ util::CheckAndClearJniExceptions (env);
451+ env->DeleteLocalRef (version_string);
452+ env->DeleteLocalRef (library_string);
453+ env->DeleteLocalRef (registrar);
454+ }
455+
413456void App::RegisterLibrary (const char * library, const char * version) {
457+ RegisterLibraryWithVersionRegistrar (util::GetJNIEnvFromApp (), library,
458+ version);
414459 app_common::RegisterLibrary (library, version);
415460}
416461
0 commit comments