bool Initialize()

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;
}