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