diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/CompositeReactPackageTurboModuleManagerDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/CompositeReactPackageTurboModuleManagerDelegate.java index 59ed163e91a..973fdf7cf5b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/CompositeReactPackageTurboModuleManagerDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/CompositeReactPackageTurboModuleManagerDelegate.java @@ -12,7 +12,6 @@ import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.turbomodule.core.TurboModuleManagerDelegate; -import com.facebook.soloader.SoLoader; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -21,8 +20,6 @@ import java.util.List; public class CompositeReactPackageTurboModuleManagerDelegate extends ReactPackageTurboModuleManagerDelegate { - private static volatile boolean sIsSoLibraryLoaded; - protected native HybridData initHybrid(); private CompositeReactPackageTurboModuleManagerDelegate( @@ -53,12 +50,4 @@ public class CompositeReactPackageTurboModuleManagerDelegate return new CompositeReactPackageTurboModuleManagerDelegate(context, packages, delegates); } } - - protected synchronized void maybeLoadOtherSoLibraries() { - // Prevents issues with initializer interruptions. See T38996825 and D13793825 for more context. - if (!sIsSoLibraryLoaded) { - SoLoader.loadLibrary("turbomodulejsijni"); - sIsSoLibraryLoaded = true; - } - } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/CallInvokerHolderImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/CallInvokerHolderImpl.java index 3f1321a6870..e59bc786e46 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/CallInvokerHolderImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/CallInvokerHolderImpl.java @@ -9,7 +9,6 @@ package com.facebook.react.turbomodule.core; import com.facebook.jni.HybridData; import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder; -import com.facebook.soloader.SoLoader; /** * JSCallInvoker is created at a different time/place (i.e: in CatalystInstance) than @@ -17,20 +16,13 @@ import com.facebook.soloader.SoLoader; * pass it from CatalystInstance, through Java, to TurboModuleManager::initHybrid. */ public class CallInvokerHolderImpl implements CallInvokerHolder { - private static volatile boolean sIsSoLibraryLoaded; - private final HybridData mHybridData; - private CallInvokerHolderImpl(HybridData hd) { - maybeLoadSoLibrary(); - mHybridData = hd; + static { + NativeModuleSoLoader.maybeLoadSoLibrary(); } - // Prevents issues with initializer interruptions. See T38996825 and D13793825 for more context. - private static synchronized void maybeLoadSoLibrary() { - if (!sIsSoLibraryLoaded) { - SoLoader.loadLibrary("turbomodulejsijni"); - sIsSoLibraryLoaded = true; - } + private CallInvokerHolderImpl(HybridData hd) { + mHybridData = hd; } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeMethodCallInvokerHolderImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeMethodCallInvokerHolderImpl.java index 79b2bea4707..1f7012bdfb7 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeMethodCallInvokerHolderImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeMethodCallInvokerHolderImpl.java @@ -9,7 +9,6 @@ package com.facebook.react.turbomodule.core; import com.facebook.jni.HybridData; import com.facebook.react.turbomodule.core.interfaces.NativeMethodCallInvokerHolder; -import com.facebook.soloader.SoLoader; /** * NativeMethodCallInvokerHolder is created at a different time/place (i.e: in CatalystInstance) @@ -18,20 +17,14 @@ import com.facebook.soloader.SoLoader; * TurboModuleManager::initHybrid. */ public class NativeMethodCallInvokerHolderImpl implements NativeMethodCallInvokerHolder { - private static volatile boolean sIsSoLibraryLoaded; private final HybridData mHybridData; - private NativeMethodCallInvokerHolderImpl(HybridData hd) { - maybeLoadSoLibrary(); - mHybridData = hd; + static { + NativeModuleSoLoader.maybeLoadSoLibrary(); } - // Prevents issues with initializer interruptions. See T38996825 and D13793825 for more context. - private static synchronized void maybeLoadSoLibrary() { - if (!sIsSoLibraryLoaded) { - SoLoader.loadLibrary("turbomodulejsijni"); - sIsSoLibraryLoaded = true; - } + private NativeMethodCallInvokerHolderImpl(HybridData hd) { + mHybridData = hd; } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeModuleSoLoader.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeModuleSoLoader.kt new file mode 100644 index 00000000000..0c2221d13fa --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/NativeModuleSoLoader.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.turbomodule.core + +import com.facebook.soloader.SoLoader + +internal class NativeModuleSoLoader { + companion object { + private var isSoLibraryLoaded = false + + @Synchronized + @JvmStatic + fun maybeLoadSoLibrary() { + if (!isSoLibraryLoaded) { + SoLoader.loadLibrary("turbomodulejsijni") + isSoLibraryLoaded = true + } + } + } +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java index aa29e666d26..1a3d3a9a0f6 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java @@ -25,7 +25,6 @@ import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder; import com.facebook.react.turbomodule.core.interfaces.NativeMethodCallInvokerHolder; import com.facebook.react.turbomodule.core.interfaces.TurboModule; import com.facebook.react.turbomodule.core.interfaces.TurboModuleRegistry; -import com.facebook.soloader.SoLoader; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -38,12 +37,15 @@ import java.util.Map; * a Java module, that the C++ counterpart calls. */ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { - private static volatile boolean sIsSoLibraryLoaded; private final List mEagerInitModuleNames; private final ModuleProvider mTurboModuleProvider; private final ModuleProvider mLegacyModuleProvider; private final TurboModuleManagerDelegate mDelegate; + static { + NativeModuleSoLoader.maybeLoadSoLibrary(); + } + // Prevents the creation of new TurboModules once cleanup as been initiated. private final Object mModuleCleanupLock = new Object(); @@ -63,7 +65,6 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { @Nullable final TurboModuleManagerDelegate delegate, CallInvokerHolder jsCallInvokerHolder, NativeMethodCallInvokerHolder nativeMethodCallInvokerHolder) { - maybeLoadSoLibrary(); mDelegate = delegate; mHybridData = initHybrid( @@ -451,14 +452,6 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { mHybridData.resetNative(); } - // Prevents issues with initializer interruptions. See T38996825 and D13793825 for more context. - private static synchronized void maybeLoadSoLibrary() { - if (!sIsSoLibraryLoaded) { - SoLoader.loadLibrary("turbomodulejsijni"); - sIsSoLibraryLoaded = true; - } - } - private static class ModuleHolder { private volatile NativeModule mModule = null; private volatile boolean mIsTryingToCreate = false; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java index 4c187079eb3..5e83bb5d8e6 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java @@ -12,7 +12,6 @@ import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.NativeModule; import com.facebook.react.turbomodule.core.interfaces.TurboModule; -import com.facebook.soloader.SoLoader; import java.util.ArrayList; import java.util.List; @@ -21,13 +20,14 @@ public abstract class TurboModuleManagerDelegate { @SuppressWarnings("unused") private final HybridData mHybridData; - private static volatile boolean sIsSoLibraryLoaded; + static { + NativeModuleSoLoader.maybeLoadSoLibrary(); + } protected abstract HybridData initHybrid(); protected TurboModuleManagerDelegate() { maybeLoadOtherSoLibraries(); - maybeLoadSoLibrary(); mHybridData = initHybrid(); } @@ -57,13 +57,5 @@ public abstract class TurboModuleManagerDelegate { return new ArrayList<>(); } - // Prevents issues with initializer interruptions. See T38996825 and D13793825 for more context. - private static synchronized void maybeLoadSoLibrary() { - if (!sIsSoLibraryLoaded) { - SoLoader.loadLibrary("turbomodulejsijni"); - sIsSoLibraryLoaded = true; - } - } - protected synchronized void maybeLoadOtherSoLibraries() {} } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModulePerfLogger.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModulePerfLogger.java index 5bb2a8ca9f7..b845b0c9cd5 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModulePerfLogger.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModulePerfLogger.java @@ -9,13 +9,16 @@ package com.facebook.react.turbomodule.core; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.perflogger.NativeModulePerfLogger; -import com.facebook.soloader.SoLoader; import javax.annotation.Nullable; @DoNotStrip public class TurboModulePerfLogger { + @Nullable private static NativeModulePerfLogger sNativeModulePerfLogger = null; - private static boolean sIsSoLibraryLoaded = false; + + static { + NativeModuleSoLoader.maybeLoadSoLibrary(); + } public static void moduleDataCreateStart(String moduleName, int id) { if (sNativeModulePerfLogger != null) { @@ -79,17 +82,9 @@ public class TurboModulePerfLogger { private static native void jniEnableCppLogging(NativeModulePerfLogger perfLogger); - private static synchronized void maybeLoadSoLibrary() { - if (!sIsSoLibraryLoaded) { - SoLoader.loadLibrary("turbomodulejsijni"); - sIsSoLibraryLoaded = true; - } - } - public static void enableLogging(NativeModulePerfLogger perfLogger) { if (perfLogger != null) { sNativeModulePerfLogger = perfLogger; - maybeLoadSoLibrary(); jniEnableCppLogging(perfLogger); } }