in app/src/util_android.cc [445:545]
bool Initialize(JNIEnv* env, jobject activity_object) {
// Note: We increment g_initialized_count when it's possible to call
// Terminate() in all clean up code paths. ScopedCleanup calls Terminate() to
// clean up when its destructor is called, decrementing g_initialized_count.
if (g_initialized_count != 0) {
g_initialized_count++;
return true;
}
if (!InitializeActivityClasses(env, activity_object)) {
return false;
}
// Cache method pointers.
if (!(array_list::CacheMethodIds(env, activity_object) &&
asset_file_descriptor::CacheMethodIds(env, activity_object) &&
boolean_class::CacheMethodIds(env, activity_object) &&
bundle::CacheMethodIds(env, activity_object) &&
byte_class::CacheMethodIds(env, activity_object) &&
character_class::CacheMethodIds(env, activity_object) &&
class_class::CacheMethodIds(env, activity_object) &&
content_resolver::CacheMethodIds(env, activity_object) &&
context::CacheMethodIds(env, activity_object) &&
cursor::CacheMethodIds(env, activity_object) &&
date::CacheMethodIds(env, activity_object) &&
dex_class_loader::CacheMethodIds(env, activity_object) &&
double_class::CacheMethodIds(env, activity_object) &&
file::CacheMethodIds(env, activity_object) &&
file_output_stream::CacheMethodIds(env, activity_object) &&
float_class::CacheMethodIds(env, activity_object) &&
hash_map::CacheMethodIds(env, activity_object) &&
integer_class::CacheMethodIds(env, activity_object) &&
intent::CacheMethodIds(env, activity_object) &&
iterable::CacheMethodIds(env, activity_object) &&
iterator::CacheMethodIds(env, activity_object) &&
list::CacheMethodIds(env, activity_object) &&
long_class::CacheMethodIds(env, activity_object) &&
map::CacheMethodIds(env, activity_object) &&
parcel_file_descriptor::CacheMethodIds(env, activity_object) &&
resources::CacheMethodIds(env, activity_object) &&
set::CacheMethodIds(env, activity_object) &&
short_class::CacheMethodIds(env, activity_object) &&
string::CacheMethodIds(env, activity_object) &&
throwable::CacheMethodIds(env, activity_object) &&
uri::CacheMethodIds(env, activity_object) &&
object::CacheMethodIds(env, activity_object) &&
uribuilder::CacheMethodIds(env, activity_object))) {
ReleaseClasses(env);
TerminateActivityClasses(env);
return false;
}
ScopedCleanup<JNIEnv> cleanup(Terminate, env);
// If anything returns early from here on, it will run Terminate to clean up
// via the ScopedCleanup destructor. That will decrement the reference count,
// so we need to bump the ref count now.
g_initialized_count++;
#if defined(FIREBASE_ANDROID_FOR_DESKTOP)
// Cache JVM class-loader for desktop.
if (!(java_uri::CacheMethodIds(env, activity_object) &&
url::CacheMethodIds(env, activity_object) &&
url_class_loader::CacheMethodIds(env, activity_object))) {
return false;
}
#endif // defined(FIREBASE_ANDROID_FOR_DESKTOP)
// Cache embedded files and load embedded classes.
const std::vector<internal::EmbeddedFile> embedded_files =
util::CacheEmbeddedFiles(
env, activity_object,
internal::EmbeddedFile::ToVector(firebase_app::app_resources_filename,
firebase_app::app_resources_data,
firebase_app::app_resources_size));
// Cache the Log class and register the native log method.
if (!(log::CacheClassFromFiles(env, activity_object, &embedded_files) !=
nullptr &&
log::CacheMethodIds(env, activity_object) &&
log::RegisterNatives(env, kNativeLogMethods,
FIREBASE_ARRAYSIZE(kNativeLogMethods)))) {
return false;
}
if (!(jniresultcallback::CacheClassFromFiles(env, activity_object,
&embedded_files) &&
jniresultcallback::CacheMethodIds(env, activity_object) &&
jniresultcallback::RegisterNatives(env, &kJniCallbackMethod, 1))) {
return false;
}
if (!JavaThreadContext::Initialize(env, activity_object, embedded_files)) {
return false;
}
CheckAndClearJniExceptions(env);
g_task_callbacks = new std::map<const char*, std::list<CallbackData>>();
g_task_callbacks_mutex = PTHREAD_MUTEX_INITIALIZER;
cleanup.Cancel();
return true;
}