Android: ReactInstanceManagerBuilder.build fails unless SoLoader.init has been explicitly called.
The ReactInstanceManager constructor calls initializeSoLoaderIfNecessary, so the intent is clearly that things should work without an explicit call to SoLoader.init on the part of the application. However, with the introduction of Hermes, we have ReactInstanceManagerBuilder.getDefaultJSExecutorFactory, which gets called before the ReactInstanceManager constructor. It attempts this:
SoLoader.loadLibrary("jscexecutor");
This fails. A simple fix is to ensure that the SoLoader is initialized first. I have a PR that fixes the issue.
React Native version:
System:
OS: Windows 10
CPU: (8) x64 Intel(R) Xeon(R) CPU E5-1620 v3 @ 3.50GHz
Memory: 11.43 GB / 31.93 GB
Binaries:
Node: 10.16.3 - C:\Program Files\nodejs\node.EXE
Yarn: 1.17.3 - C:\Program Files (x86)\Yarn\bin\yarn.CMD
npm: 6.9.0 - C:\Program Files\nodejs\npm.CMD
SDKs:
Android SDK:
Android NDK: 17.2.4988734
IDEs:
Android Studio: Version 3.5.0.0 AI-191.8026.42.35.5791312
Steps To Reproduce
- In
RNTester.onCreate, remove the call to SoLoader.init
- Run the app
The app crashes with the following stack trace:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.facebook.react.uiapp/com.facebook.react.uiapp.RNTesterActivity}: java.lang.RuntimeException: SoLoader.init() not yet called
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.RuntimeException: SoLoader.init() not yet called
at com.facebook.soloader.SoLoader.assertInitialized(SoLoader.java:781)
at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:505)
at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:484)
at com.facebook.react.ReactInstanceManagerBuilder.getDefaultJSExecutorFactory(ReactInstanceManagerBuilder.java:291)
at com.facebook.react.ReactInstanceManagerBuilder.build(ReactInstanceManagerBuilder.java:266)
at com.facebook.react.ReactNativeHost.createReactInstanceManager(ReactNativeHost.java:86)
at com.facebook.react.ReactNativeHost.getReactInstanceManager(ReactNativeHost.java:38)
at com.facebook.react.ReactDelegate.loadApp(ReactDelegate.java:103)
at com.facebook.react.ReactActivityDelegate.loadApp(ReactActivityDelegate.java:83)
at com.facebook.react.ReactActivityDelegate.onCreate(ReactActivityDelegate.java:78)
at com.facebook.react.uiapp.RNTesterActivity$RNTesterActivityDelegate.onCreate(RNTesterActivity.java:40)
at com.facebook.react.ReactActivity.onCreate(ReactActivity.java:44)
at android.app.Activity.performCreate(Activity.java:7183)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Related issues
These touch upon the issue, but have been closed after workarounds were found:
Android:
ReactInstanceManagerBuilder.buildfails unlessSoLoader.inithas been explicitly called.The
ReactInstanceManagerconstructor callsinitializeSoLoaderIfNecessary, so the intent is clearly that things should work without an explicit call toSoLoader.initon the part of the application. However, with the introduction of Hermes, we haveReactInstanceManagerBuilder.getDefaultJSExecutorFactory, which gets called before theReactInstanceManagerconstructor. It attempts this:This fails. A simple fix is to ensure that the
SoLoaderis initialized first. I have a PR that fixes the issue.React Native version:
Steps To Reproduce
RNTester.onCreate, remove the call toSoLoader.initThe app crashes with the following stack trace:
Related issues
These touch upon the issue, but have been closed after workarounds were found: