diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java index 77b2e0f8cd4..e2809cd6580 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java @@ -297,8 +297,34 @@ public class ReactInstanceManagerBuilder { SoLoader.loadLibrary("jscexecutor"); return new JSCExecutorFactory(appName, deviceName); } catch (UnsatisfiedLinkError jscE) { + // https://github.com/facebook/hermes/issues/78 shows that + // people who aren't trying to use Hermes are having issues. + // https://github.com/facebook/react-native/issues/25923#issuecomment-554295179 + // includes the actual JSC error in at least one case. + // + // So, if "__cxa_bad_typeid" shows up in the jscE exception + // message, then we will assume that's the failure and just + // throw now. + + if (jscE.getMessage().contains("__cxa_bad_typeid")) { + throw jscE; + } + // Otherwise use Hermes - return new HermesExecutorFactory(); + try { + return new HermesExecutorFactory(); + } catch (UnsatisfiedLinkError hermesE) { + // If we get here, either this is a JSC build, and of course + // Hermes failed (since it's not in the APK), or it's a Hermes + // build, and Hermes had a problem. + + // We suspect this is a JSC issue (it's the default), so we + // will throw that exception, but we will print hermesE first, + // since it could be a Hermes issue and we don't want to + // swallow that. + hermesE.printStackTrace(); + throw jscE; + } } } }