React-Native:java.lang.UnsatisfiedLinkError:找不到要加载的DSO:libhermes.so

V-X*_*eme 34 android react-native

我刚刚将项目更新为使用react-native版本0.60.2。但是,当我尝试在Android设备上运行应用程序时,启动屏幕后它将崩溃。我收到以下错误日志:

E/AndroidRuntime: FATAL EXCEPTION: create_react_context
    Process: com.tjspeed, PID: 3909
    java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so
        at com.facebook.soloader.SoLoader.doLoadLibraryBySoName(SoLoader.java:738)
        at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:591)
        at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:529)
        at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:484)
        at com.facebook.hermes.reactexecutor.HermesExecutor.<clinit>(HermesExecutor.java:20)
        at com.facebook.hermes.reactexecutor.HermesExecutorFactory.create(HermesExecutorFactory.java:27)
        at com.facebook.react.ReactInstanceManager$5.run(ReactInstanceManager.java:949)
        at java.lang.Thread.run(Thread.java:760)
Run Code Online (Sandbox Code Playgroud)

这里的建议很少:https : //github.com/facebook/react-native/issues/25601,但不幸的是,这些建议都不对我有用。请提出解决方法。

sam*_*ady 42

我刚刚清理了 android 的构建文件夹,之后,它运行良好。希望能帮到朋友。

cd android
./gradlew clean 
Run Code Online (Sandbox Code Playgroud)

  • 是的,发现这是一个荒谬的修复,非常令人失望 (2认同)

Vin*_*zzz 25

从0.59.8升级到0.60.4后,我遇到了同样的问题

确保已在app / build.gradle中添加了所有这些行,尤其是依赖项部分,因为这确保您具有JSC二进制文件

project.ext.react = [

...
    // your index js if not default, other settings
  // Hermes JSC ?
 enableHermes: false,

...
]

def jscFlavor = 'org.webkit:android-jsc:+'

def enableHermes = project.ext.react.get("enableHermes", false);

dependencies {

    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "com.facebook.react:react-native:+"  // From node_modules

    if (enableHermes) {
      // For RN 0.60.x
      def hermesPath = "../../node_modules/hermesvm/android/"

      // --- OR ----          

      // for RN 0.61+
      def hermesPath = "../../node_modules/hermes-engine/android/";


      debugImplementation files(hermesPath + "hermes-debug.aar")
      releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
      implementation jscFlavor
    }
Run Code Online (Sandbox Code Playgroud)

编辑

另外,确保Hermes Maven存储库位于您的根目录build.gradle中

maven {
        // Android JSC is installed from npm
        url("$rootDir/../node_modules/jsc-android/dist")
    }
Run Code Online (Sandbox Code Playgroud)

  • 在react-native 0.61中,android/app/build.gradle中的hermesvm部分已移至hermes-engine:https://github.com/facebook/react-native/blob/0.61-stable/template/android/app/build .gradle#L186 (4认同)
  • 升级到0.60.4后,这对我不起作用。我尝试了多次清洁。我似乎无法禁用爱马仕。我在启动时崩溃“找不到要加载的DSO:libhermes.so” (3认同)
  • 确保在 src/android/build.gradle 中,您还添加了 Hermes 库的 Maven 存储库(就像其他答案建议的那样)。它可能与 JavaScriptCore 有关,而不是专门与 Hermes 有关 (3认同)

小智 11

我在project_dir / build.gradle的allProject块中添加了该块,然后崩溃消失了。

    maven {
        // Android JSC is installed from npm
        url("$rootDir/../node_modules/jsc-android/dist")
    }
Run Code Online (Sandbox Code Playgroud)

我所做的是使用react-native init创建一个新项目,并通过了android build文件。幸运的是,这是我注意到并解决了我的问题的第一个区别。我想如果这不起作用,您也可以这样做。

  • 添加该行会在构建过程中导致以下错误:“错误:包 com.facebook.react.module.annotations 不存在” (2认同)

Sta*_*ryi 11

  1. 打开 node_modules/jsc-android/README.md
  2. 找到“如何在我的 React Native 应用程序中使用它”部分

例如:

  1. 修改 android/build.gradle
allprojects {
    repositories {
        maven {
            // All of React Native (JS, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
        maven {
            // Local Maven repo containing AARs with JSC library built for Android
            url "$rootDir/../node_modules/jsc-android/dist"
        }
        google()
        jcenter()

    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 修改 android/app/build.gradle
android {
    packagingOptions {
        pickFirst '**/libjsc.so'
        pickFirst '**/libc++_shared.so'
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation "org.webkit:android-jsc:+"
    implementation "com.facebook.react:react-native:+" // From node_modules
}
Run Code Online (Sandbox Code Playgroud)


And*_*dru 10

如果您在更新到 React Native 版本时遇到此错误0.62.2

将以下内容添加到您的android/app/build.gradle文件中:

dependencies {
   implementation 'com.facebook.soloader:soloader:0.9.0+'
Run Code Online (Sandbox Code Playgroud)

作为第一个implementation条目之一。

从这里采取的解决方案

  • 实施后仍然存在此问题---&gt;无法找到要加载的DSO:libhermes.so SoSource 0:com.facebook.soloader.ApkSoSource[root = /data/data/com.tootitoo.tootitoo/lib-main flags = 1] SoSource 1: com.facebook.soloader.DirectorySoSource[root = /data/app/com.tootitoo.tootitoo-1/lib/arm flags = 0] SoSource 2: com.facebook.soloader.DirectorySoSource[root = /system /vendor/lib flags = 2] SoSource 3: com.facebook.soloader.DirectorySoSource[root = /system/lib flags = 2] 本机 lib 目录: /data/app/com.tootitoo.tootitoo-1/lib/arm 结果: 0 (2认同)

小智 8

我已经通过添加解决了这个问题

 configurations.all {
    resolutionStrategy {
        force "com.facebook.soloader:soloader:0.8.2"
    }
}
Run Code Online (Sandbox Code Playgroud)


Pio*_*ura 5

就我而言,我需要为每种 Android 风格添加 Hermes 路径

    if (enableHermes) {
        def hermesPath = "../../node_modules/hermes-engine/android/";
        debugImplementation files(hermesPath + "hermes-debug.aar")
        releaseImplementation files(hermesPath + "hermes-release.aar")
        qaImplementation files(hermesPath + "hermes-release.aar")
        stageImplementation files(hermesPath + "hermes-release.aar")
        prodImplementation files(hermesPath + "hermes-release.aar")
    } else {
        implementation jscFlavor
    }
Run Code Online (Sandbox Code Playgroud)