Don't initialize jvm in PeerConnectionFactory if it is already initialized.

Goal is to fix PeerConnectionFactoryTest.NativeToJavaPeerConnectionFactory flakiness on Android (https://ci.chromium.org/ui/tests/p/webrtc/clusters/testname-v4/58398f78c8a0f7acb3962fe872b81723):

# Fatal error in: ../../modules/utility/source/jvm_android.cc, line 218
# last system error: 0
# Check failed: !g_jvm

Change-Id: I3c90a5af0bb9c2089aa26b8cc99bb595eca56d62
Bug: None
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/482940
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Jeremy Leconte <jleconte@google.com>
Cr-Commit-Position: refs/heads/main@{#48035}
diff --git a/modules/utility/include/jvm_android.h b/modules/utility/include/jvm_android.h
index 5838aa2..3e5f849 100644
--- a/modules/utility/include/jvm_android.h
+++ b/modules/utility/include/jvm_android.h
@@ -162,6 +162,8 @@
   // Gives access to the global Java VM interface pointer, which then can be
   // used to create a valid JNIEnvironment object or to get a JavaClass object.
   static JVM* GetInstance();
+  // Returns true if JVM has been initialized.
+  static bool IsInitialized();
 
   // Creates a JNIEnvironment object.
   // This method returns a NULL pointer if AttachCurrentThread() has not been
diff --git a/modules/utility/source/jvm_android.cc b/modules/utility/source/jvm_android.cc
index 590fa0e..16ca0c9 100644
--- a/modules/utility/source/jvm_android.cc
+++ b/modules/utility/source/jvm_android.cc
@@ -23,7 +23,7 @@
 
 namespace webrtc {
 
-JVM* g_jvm;
+JVM* g_jvm = nullptr;
 
 // TODO(henrika): add more clases here if needed.
 struct {
@@ -212,10 +212,9 @@
   return ret;
 }
 
-// static
 void JVM::Initialize(JavaVM* jvm) {
   RTC_LOG(LS_INFO) << "JVM::Initialize";
-  RTC_CHECK(!g_jvm);
+  RTC_CHECK(g_jvm == nullptr);
   g_jvm = new JVM(jvm);
 }
 
@@ -230,20 +229,22 @@
   jni->CallStaticVoidMethod(context_utils, initialize_method, context);
 }
 
-// static
 void JVM::Uninitialize() {
   RTC_LOG(LS_INFO) << "JVM::Uninitialize";
-  RTC_DCHECK(g_jvm);
+  RTC_DCHECK(g_jvm != nullptr);
   delete g_jvm;
   g_jvm = nullptr;
 }
 
-// static
 JVM* JVM::GetInstance() {
-  RTC_DCHECK(g_jvm);
+  RTC_DCHECK(g_jvm != nullptr);
   return g_jvm;
 }
 
+bool JVM::IsInitialized() {
+  return g_jvm != nullptr;
+}
+
 JVM::JVM(JavaVM* jvm) : jvm_(jvm) {
   RTC_LOG(LS_INFO) << "JVM::JVM";
   RTC_CHECK(jni()) << "AttachCurrentThread() must be called on this thread.";
diff --git a/sdk/android/src/jni/pc/peer_connection_factory.cc b/sdk/android/src/jni/pc/peer_connection_factory.cc
index 4fae2fb..fc244f8 100644
--- a/sdk/android/src/jni/pc/peer_connection_factory.cc
+++ b/sdk/android/src/jni/pc/peer_connection_factory.cc
@@ -198,7 +198,11 @@
 
 static void JNI_PeerConnectionFactory_InitializeAndroidGlobals(JNIEnv* jni) {
   if (!factory_static_initialized) {
-    JVM::Initialize(GetJVM());
+    if (JVM::IsInitialized()) {
+      RTC_LOG(LS_WARNING) << "Trying to initialize the JVM more than once!";
+    } else {
+      JVM::Initialize(GetJVM());
+    }
     factory_static_initialized = true;
   }
 }