获取"java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so"错误

14

我正在将一个React Native项目从0.58.5版本迁移到0.60.4版本。

对于Android部分,我已经完成了这里提到的所有更改。

我在我的应用程序build.gradle文件中禁用了Hermes:

project.ext.react = [
    entryFile: "index.js",
    enableHermes: false,  // clean and rebuild if changing
]
...
def jscFlavor = 'org.webkit:android-jsc:+'
def enableHermes = project.ext.react.get("enableHermes", false);
...
dependencies {
    ...

    if (enableHermes) {
      println 'Hermes is enabled'
      def hermesPath = "../../node_modules/hermesvm/android/";
      debugImplementation files(hermesPath + "hermes-debug.aar")
      releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
      println 'Hermes is disabled'
      implementation jscFlavor
    }
}
...

我可以在构建时看到Hermes已禁用的打印信息。这正是我想要的。

使用react-native run-android启动Android应用程序时,我在启动时遇到以下崩溃:

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

经过一些研究,我发现这种崩溃发生在想要启用Hermes并且具有错误gradle配置的人身上: [0.60.3] 启用Hermes(enableHermes:true)时应用程序崩溃

为什么我在禁用Hermes的情况下会遇到此崩溃?

请注意,将enableHermes设置为true时不会发生崩溃。


你在将Hermes设置为false后,是否进行了清理和重建操作? - Ovidiu Latcu
你可以试试这个命令吗?./gradlew clean build - hong developer
@OvidiuLatcu 是的,我尝试了清理和重建,但结果相同。 - cjosepha
@cjosepha 你有找到对你有效的答案吗? - honor
@cjosepha,我也在想同样的问题...只是无法解决它。 - Tadej
6个回答

2

我通过一次微小的改动解决了这个问题,具体步骤可参考这篇文章

然后,请确保将以下代码块添加到您的 android/build.gradle 中:

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

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

        google()
        jcenter()
    }
}

谢谢。我已经为这个令人沮丧的问题奋斗了一整天,现在终于解决了我的问题。 - Dave
我在使用react-native 0.61.5和0.62.2版本时仍然遇到这个问题,你提出的改变似乎并没有解决它...而且其他在GitHub上评论此问题的人也在同样的版本上遇到了问题... - Tadej
@Tadej,你最终找到原因了吗?我也遇到了同样的问题。 - Adonis K. Kakoulidis
@AdonisK.Kakoulidis 我不确定,最近没有发布新版本,所以只测试了有限的设备,但似乎更新soloader可能是一个解决方案。我认为你应该关注这个问题:https://github.com/facebook/react-native/issues/25537 顺便说一下,这个问题并没有导致应用程序崩溃,所以我认为它不是一个严重的问题。 - Tadej

1

您可以通过将configurations.all添加到您的build.gradle中,来使用旧版本的com.facebook.soloader:soloader。

configurations.all {
    resolutionStrategy {
        force "com.facebook.soloader:soloader:0.8.2"
    }
}

像这样的 build.gradle。
buildscript {
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'

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

configurations.all {
    resolutionStrategy {
        force "com.facebook.soloader:soloader:0.8.2"
    }
}

allprojects {
    repositories {
        google()
        jcenter()

    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


如果上述步骤无效,请执行以下步骤:

app/build.gradle.

android {
  ...
  // add the following packagingOptions 
  packagingOptions {
    pickFirst 'lib/x86_64/libjsc.so'
    pickFirst 'lib/arm64-v8a/libjsc.so'
  }
}

我们还在app/build.gradle文件的defaultConfig中添加了以下内容。
ndk {
  abiFilters 'armeabi-v7a', 'x86'
}

对我没用 + Google Play 抱怨因为 x64 平台被过滤掉了。即使包括了这些,应用程序仍然会因为相同的错误而崩溃... - Tadej

0

这个错误通常出现在安卓11用户中

在你的项目级别的build.gradle文件中,添加以下代码片段

allprojects{
    respositories{
    ...
    google()
    jcenter()
    configurations.all {
        resolutionStrategy {

            // use 0.9.0 to fix crash on Android 11
            force "com.facebook.soloader:soloader:0.9.0"
        }
    }
}

0

我在我的Android 10应用程序中遇到了同样的问题。

我通过更改以下内容来解决它

implementation "com.facebook.react:react-native:+" // From node_modules

进入

implementation ("com.facebook.react:react-native") version {
        strictly "0.63.2" // pass in your react-native version
}

我也已经禁用了Hermes

project.ext.react = [
    enableHermes: false,
]

我的 packagingOptions 看起来像这样,

packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
        exclude("META-INF/*.kotlin_module")

        pickFirst 'lib/armeabi-v7a/libfbjni.so'
        pickFirst 'lib/arm64-v8a/libc++_shared.so'
        pickFirst 'lib/arm64-v8a/libfbjni.so'
        pickFirst 'lib/x86_64/libfbjni.so'
        pickFirst 'lib/x86/libfbjni.so'
        pickFirst 'lib/x86/libc++_shared.so'
        pickFirst 'lib/x86_64/libc++_shared.so'
        pickFirst 'lib/armeabi-v7a/libc++_shared.so'
    }

0

我注意到问题存在于0.61.5版本中...我尝试升级到0.62.2版本,但仍然存在相同的问题。因此,该问题似乎与版本无关,这就是为什么我怀疑升级助手能否提供帮助的原因。 - Tadej

0

我通过以下步骤解决了这个问题

  1. 安装hermesvm:npm i hermesvm
  2. 安装jsc-android:npm i jsc-android

3.将以下行添加到app/build.gradle中

project.ext.react = [
   entryFile: "index.js" ,
   enableHermes: false
]

def jscFlavor = 'org.webkit:android-jsc:+'
def enableHermes = project.ext.react.get("enableHermes", false);


dependencies {
   if (enableHermes) {
       def hermesPath = "../../node_modules/hermesvm/android/";
       debugImplementation files(hermesPath + "hermes-debug.aar")
       releaseImplementation files(hermesPath + "hermes-release.aar")
    }
   else { implementation jscFlavor }
  1. 将以下 jsc-android 代码块添加到你的 android/build.gradle 文件中:
     allprojects {
       repositories {
         maven {
           url("$rootDir/../node_modules/react-native/android")
         }
         maven {
            url "$rootDir/../node_modules/react-native/android"
         }
         google()
         jcenter()
       }
     }

4
我认为您的意思是:maven { url("$rootDir/../node_modules/jsc-android/dist") },这是第二个。 - Dror Bar
1
我尝试过这个方法,但好像不能解决react-native 0.62.2的问题。 - Tadej

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