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

127

我刚刚将我的项目更新到使用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)

这里有一些建议:https://github.com/facebook/react-native/issues/25601,但不幸的是,它们都对我无效。请提供解决方法。


v0.60 变更日志/博客:随着这个变化,React Native 应用程序需要开始自己使用 AndroidX。它们不能在一个应用程序中并行使用,因此所有应用程序代码和依赖项代码都需要使用其中之一。这可能是你的情况吗? - AsifM
与 https://dev59.com/Fek5XIcBkEYKwwoY3tgY 相关的编程内容。 - 0xcaff
26个回答

66

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

确保您已添加了所有这些行到您的 app/build.gradle 文件中,特别是 dependencies 部分,因为这可以确保您具有 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
    }

编辑

同时确保Hermes Maven仓库在你的根build.gradle文件中。

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

28
在升级到0.60.4版本后,这对我没有起作用。我尝试了多次干净安装,但好像无法禁用Hermes引擎。启动时出现崩溃错误:"couldn't find DSO to load: libhermes.so"。 - Ed of the Mountain
3
请确保在 src/android/build.gradle 中,你也已经添加了Hermes库的maven仓库(就像其他答案提议的那样)。这可能与JavaScriptCore有关,而不是具体与Hermes相关。 - Vinzzz
谢谢!我缺少“maven {url("$rootDir/../node_modules/jsc-android/dist")}”这一部分。 - Ed of the Mountain
谢谢!它对我有用,但别忘了在项目 build.gradle 中添加此块。maven { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") } - Vishal Gadhiya
4
在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 - Mike Hardy
显示剩余3条评论

47

我刚刚清理了Android的构建文件夹,之后它就正常工作了。希望这能帮到你,伙计。

cd android
./gradlew clean 

1
数小时的调试和搜索,最终通过一次干净的修复解决了问题... - Tiberiu Popescu
2
是的,发现这只是一个荒谬的修复方案,真的让人非常失望。 - samernady
每次我创建一个捆绑版本时,都会出现这个错误,需要每次运行清理。 - Tiberiu Popescu
我认为这个问题是在我升级nodejs版本时开始的。不管怎样,这解决了我的问题! - King Julien

24

我在project_dir/build.gradle的allProject块中添加了这个代码块,这样崩溃问题就解决了。

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

我所做的是使用react-native init创建了一个新项目,并查看了安卓构建文件。幸运的是,我注意到了第一个不同之处,并解决了我的问题。如果这种方法不起作用,我想你也可以尝试同样的做法。


@msqar 我也一样 - 0x01Brain
2
添加该行代码导致构建过程中出现以下错误: 错误:找不到包com.facebook.react.module.annotations - 0x01Brain
1
在这里验证更改可能是一个好主意。 https://react-native-community.github.io/upgrade-helper/ - P-RAD

16

如果你在更新到React Native版本0.62.2时遇到以下错误:

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

dependencies {
   implementation 'com.facebook.soloader:soloader:0.9.0+'

作为最早的实施入口之一。 这里采用的解决方案

5
实施后仍然存在这个问题---> 找不到要加载的DSO:libhermes.so。SoSource 0: com.facebook.soloader.ApkSoSource [root=/data/data/com.tootitoo.tootitoo/lib-main,flag=1]。SoSource 1: com.facebook.soloader.DirectorySoSource[root=/data/app/com.tootitoo.tootitoo-1/lib/arm, flag=0]。SoSource 2: com.facebook.soloader.DirectorySoSource[root=/system/vendor/lib, flag=2]。SoSource 3: com.facebook.soloader.DirectorySoSource[root=/system/lib,flag=2]。本地库目录:/data/app/com.tootitoo.tootitoo-1/lib/arm,结果为0。 - Kyo Kurosagi

15
  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()

    }
}
  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
}

我已经按上述方法进行了操作,而且没有使用packagingOptions,这就足够了。谢谢。 - oguzhan
1
对我来说,我只需要添加 pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so' - dazza5000
长时间的研究终于找到了答案。感谢提供解决方案。 - R.Mohanraj
如果可以的话,我会为这个答案点赞一百万次!!我以为我已经疯了好几个小时了;尝试了所有上面的建议和添加第二个Maven仓库链接最终解决了问题!只有一个或另一个是不够的。非常感谢!:D - Kenny83
这是我的唯一解决方案。 - hong developer

7
我已经解决了这个问题,通过添加以下内容:
 configurations.all {
    resolutionStrategy {
        force "com.facebook.soloader:soloader:0.8.2"
    }
}

你把这个添加到哪里了,是在哪个文件中? - Andru
1
app/build.gradle inside end of dependencies { } dependencies { implementation project(':react-native-permissions') configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" } } } - dasl

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
    }

4

在尝试了所有建议但都没有成功之后,我制作了一个*.apk而不是*.aab。APK文件大小为16 MB,而AAB只有8 MB,但我终于摆脱了UnsatisfiedLinkError错误。

如何构建AAB(出现UnsatisfiedLinkError错误):

cd android && ./gradlew clean && ./gradlew bundleRelease

构建APK(无崩溃,并且Hermes也正常工作)的方法:
cd android && ./gradlew clean && ./gradlew assembleRelease

尽管这不是一个永久的解决方案,但它是一个暂时的权宜之计,目前已经为我解决了问题。谢谢! - Kent Robin

4

对于遇到此问题的其他人,有两个看起来相似的部分。您需要更新android/build.gradle中底部的repositories部分!

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext {
        buildToolsVersion = "28.0.3"
        minSdkVersion = 16
        compileSdkVersion = 28
        targetSdkVersion = 28
        supportLibVersion = "28.0.0"
    }
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath("com.android.tools.build:gradle:3.4.1")

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        mavenLocal()
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url("$rootDir/../node_modules/react-native/android")
        }
        maven {
            // Android JSC is installed from npm
            url("$rootDir/../node_modules/jsc-android/dist")
        }

        google()
        jcenter()
    }
}

1
我刚刚在项目 Gradle 中添加了 url("$rootDir/../node_modules/jsc-android/dist")。谢谢 Eliezer Steinbock。 - Guru

3

这是因为没有SOLoader。

请确保在android/app/build.gradle中的dependencies下添加了

implementation'com.facebook.soloader:soloader:0.9.0+'

清除您的构建

cd android

./gradlew clean

尝试打包

./gradlew bundleRelease

退出android文件夹

cd ../

尝试运行

npx react-native run-android –-variant=release

在我的情况下,我缺少了一个 releaseImplementation 'com.facebook.soloader:soloader:0.9.0+' - SkyzohKey
1
@michael_vons 谢谢你的解决方案。对于任何人来说,如果它似乎突然停止工作,那么在Android Studio中构建不会有问题,而且对于API低于30的情况,react-native run-android将起作用,但是对于30及以上的情况,我需要添加implementation'com.facebook.soloader:soloader:0.9.0+'就像Michael所说,并按照他的指示进行操作以使其能够与react-native一起构建。此外,在构建/启动react-native应用程序时,在Android Studio中打开logcat允许我找到问题,因为metro没有输出任何错误,而应用程序在构建时立即崩溃。 - Scott K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接