From 540b6de5aef651caa8e458dff17705c349bd04f5 Mon Sep 17 00:00:00 2001 From: Tuomas Jaakola Date: Sat, 16 Jan 2021 18:59:52 +0200 Subject: [PATCH 1/5] Load jsc or hermes lib in static method --- .../hermes/reactexecutor/HermesExecutor.java | 22 ++++++++++++------- .../react/ReactInstanceManagerBuilder.java | 6 ++++- .../react/jscexecutor/JSCExecutor.java | 12 ++++++++-- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java index 7519f2146faf6d..2081216f3f9d47 100644 --- a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java +++ b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java @@ -16,14 +16,20 @@ public class HermesExecutor extends JavaScriptExecutor { private static String mode_; static { - // libhermes must be loaded explicitly to invoke its JNI_OnLoad. - SoLoader.loadLibrary("hermes"); - try { - SoLoader.loadLibrary("hermes-executor-debug"); - mode_ = "Debug"; - } catch (UnsatisfiedLinkError e) { - SoLoader.loadLibrary("hermes-executor-release"); - mode_ = "Release"; + loadLibrary(); + } + + public static void loadLibrary() throws UnsatisfiedLinkError { + if (mode_ == null) { + // libhermes must be loaded explicitly to invoke its JNI_OnLoad. + SoLoader.loadLibrary("hermes"); + try { + SoLoader.loadLibrary("hermes-executor-debug"); + mode_ = "Debug"; + } catch (UnsatisfiedLinkError e) { + SoLoader.loadLibrary("hermes-executor-release"); + mode_ = "Release"; + } } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java index a3b33f6cfa3b71..89564ab3a4008b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java @@ -14,6 +14,7 @@ import android.app.Application; import android.content.Context; import androidx.annotation.Nullable; +import com.facebook.hermes.reactexecutor.HermesExecutor; import com.facebook.hermes.reactexecutor.HermesExecutorFactory; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.JSBundleLoader; @@ -25,6 +26,7 @@ import com.facebook.react.devsupport.RedBoxHandler; import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; import com.facebook.react.devsupport.interfaces.DevSupportManager; +import com.facebook.react.jscexecutor.JSCExecutor; import com.facebook.react.jscexecutor.JSCExecutorFactory; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.packagerconnection.RequestHandler; @@ -294,7 +296,7 @@ private JavaScriptExecutorFactory getDefaultJSExecutorFactory( try { // If JSC is included, use it as normal initializeSoLoaderIfNecessary(applicationContext); - SoLoader.loadLibrary("jscexecutor"); + JSCExecutor.loadLibrary(); return new JSCExecutorFactory(appName, deviceName); } catch (UnsatisfiedLinkError jscE) { // https://github.com/facebook/hermes/issues/78 shows that @@ -312,6 +314,8 @@ private JavaScriptExecutorFactory getDefaultJSExecutorFactory( // Otherwise use Hermes try { + // libhermes must be loaded explicitly to invoke its JNI_OnLoad. + HermesExecutor.loadLibrary(); return new HermesExecutorFactory(); } catch (UnsatisfiedLinkError hermesE) { // If we get here, either this is a JSC build, and of course diff --git a/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java b/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java index 09737c178b985a..fa81f82b24896b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java +++ b/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java @@ -14,9 +14,17 @@ import com.facebook.soloader.SoLoader; @DoNotStrip -/* package */ class JSCExecutor extends JavaScriptExecutor { +/* package */ public class JSCExecutor extends JavaScriptExecutor { + private static boolean loaded = false; static { - SoLoader.loadLibrary("jscexecutor"); + loadLibrary(); + } + + public static void loadLibrary() throws UnsatisfiedLinkError { + if (!loaded) { + SoLoader.loadLibrary("jscexecutor"); + } + loaded = true; } /* package */ JSCExecutor(ReadableNativeMap jscConfig) { From afc82702c495eca789619fcb19435ef169a9cb00 Mon Sep 17 00:00:00 2001 From: Tuomas Jaakola Date: Sat, 16 Jan 2021 20:21:35 +0200 Subject: [PATCH 2/5] google-java-format: empty line added --- .../main/java/com/facebook/react/jscexecutor/JSCExecutor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java b/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java index fa81f82b24896b..93c0130b749357 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java +++ b/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java @@ -16,6 +16,7 @@ @DoNotStrip /* package */ public class JSCExecutor extends JavaScriptExecutor { private static boolean loaded = false; + static { loadLibrary(); } From acab328f43422bc996b95a023203100d43bf54d2 Mon Sep 17 00:00:00 2001 From: Tuomas Jaakola Date: Mon, 18 Jan 2021 10:34:18 +0200 Subject: [PATCH 3/5] Extra comment removed --- .../java/com/facebook/react/ReactInstanceManagerBuilder.java | 1 - 1 file changed, 1 deletion(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java index 89564ab3a4008b..13416f244b2e6e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java @@ -314,7 +314,6 @@ private JavaScriptExecutorFactory getDefaultJSExecutorFactory( // Otherwise use Hermes try { - // libhermes must be loaded explicitly to invoke its JNI_OnLoad. HermesExecutor.loadLibrary(); return new HermesExecutorFactory(); } catch (UnsatisfiedLinkError hermesE) { From a0bca3017f18c126fbde94c1cf53806c070ca293 Mon Sep 17 00:00:00 2001 From: Tuomas Jaakola Date: Fri, 3 Sep 2021 22:38:38 +0300 Subject: [PATCH 4/5] SoLoader loads library only once --- .../java/com/facebook/react/jscexecutor/JSCExecutor.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java b/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java index 93c0130b749357..8cbb86828363bc 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java +++ b/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java @@ -15,17 +15,12 @@ @DoNotStrip /* package */ public class JSCExecutor extends JavaScriptExecutor { - private static boolean loaded = false; - static { loadLibrary(); } public static void loadLibrary() throws UnsatisfiedLinkError { - if (!loaded) { - SoLoader.loadLibrary("jscexecutor"); - } - loaded = true; + SoLoader.loadLibrary("jscexecutor"); } /* package */ JSCExecutor(ReadableNativeMap jscConfig) { From a394c7c7e9690416a1c4ecf0ef812e352956ebe8 Mon Sep 17 00:00:00 2001 From: Tuomas Jaakola Date: Tue, 14 Sep 2021 10:32:49 +0300 Subject: [PATCH 5/5] empty line added --- .../main/java/com/facebook/react/jscexecutor/JSCExecutor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java b/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java index 8cbb86828363bc..4adb377de8136c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java +++ b/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/JSCExecutor.java @@ -15,6 +15,7 @@ @DoNotStrip /* package */ public class JSCExecutor extends JavaScriptExecutor { + static { loadLibrary(); }