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


83

我刚刚更新了项目,以使用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 changelog / blog开始:进行此更改后,React Native应用程序将需要自己开始使用AndroidX。它们不能在一个应用程序中并行使用,因此所有应用程序代码和依赖项代码都需要使用一个或另一个。这可能适合您吗?
AsifM,

Answers:


61

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

编辑

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

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

11
升级到0.60.4后,这对我不起作用。我尝试了多次清洁。我似乎无法禁用爱马仕。我一开始就崩溃了“找不到DSO加载:libhermes.so”
山的Ed

3
确保在src / android / build.gradle中,您还添加了Hermes库的Maven存储库(就像其他答案所建议的那样)。它可能与JavaScriptCore有关,而与Hermes
无关-Vinzzz

谢谢!我错过了“行家{url(“ $ rootDir /../ node_modules / jsc-android / dist”)}
山之

谢谢 !!它的工作形式是我,但不要忘记在项目build.gradle maven中添加此块{// Android JSC是从npm url(“ $ rootDir /../ node_modules / jsc-android / dist”)}安装的
Vishal Gadhiya

4
在react-native 0.61中,android / app / build.gradle中的hermesvm部分已移至hermes-engine:github.com/facebook/react-native/blob/0.61-stable/template / ...
Mike Hardy

23

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

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

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


@msqar同样在这里
0x01Brain

2
添加该行在构建期间导致以下错误:error: package com.facebook.react.module.annotations does not exist
0x01Brain

1
在这里验证更改可能是一个好主意 react-native-community.github.io/upgrade-helper
P-RAD

21

我刚刚清理了android的build文件夹,然后,它运行良好。希望能帮助交配。

cd android
./gradlew clean 

数小时的调试和搜索,并通过干净的方法进行了修复
tibbus

是的,发现这是荒谬的解决方法非常令人失望
samernady

创建捆绑包发行版时,我总是会遇到此错误,每次都需要运行干净
tibbus

8
  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

对我来说,我只需要添加 pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
dazza5000

经过长时间的研究才能找到答案。感谢您的解决方案。
R.Mohanraj

7

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

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

您到底在哪里添加了该文件,并在哪个文件中添加了?
安德鲁

1
app/build.gradledependencies { } dependencies { implementation project(':react-native-permissions') configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" } } }
dasl的

5

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

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

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

作为第一批implementation条目之一。

从这里采取的解决方案


1
实施后仍有此问题--->找不到要加载的DSO:libhermes.so SoSource 0:com.facebook.soloader.ApkSoSource [root = /data/data/com.tootitoo.tootitoo/lib-main标志= 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标志= 2] SoSource 3:com.facebook.soloader.DirectorySoSource [root = / system / lib标志= 2]本机lib目录:/data/app/com.tootitoo.tootitoo-1/lib/arm结果:0
黑崎京纪

我收到相同的错误,您能解决这个问题吗?
Hugo Pretorius

你们任何人都可以解决这个问题吗?@HugoPretorius
迭戈里维拉

4

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

// 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
大师

3

将此添加到您的项目级别gradle

allprojects {
    repositories {
        maven {
            url "$rootDir/../node_modules/react-native/android"
        }
        maven {
            // Android JSC is installed from npm
            url("$rootDir/../node_modules/jsc-android/dist")
        }
        mavenLocal()
        google()
        jcenter()
    }
}

2

在遵循所有建议而没有成功之后,我构建了一个* .apk而不是一个* .aab。APK是16 MB,而不是8 MB AAB,但是我终于摆脱了UnsatisfiedLinkError。

要构建AAB(因UnsatisfiedLinkError崩溃):

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

要构建APK(没有崩溃,爱马仕也可以正常工作):

cd android && ./gradlew clean && ./gradlew assembleRelease

尽管这不是一个永久性的解决方案,但它是暂时的解决方法,目前已为我解决了该问题。谢谢!
kentrh

2

我什么也没做。./gradlew clean解决了我的问题。


因为您是正式发布较旧问题的答案。最好用一些代码和使用代码后得到的输出来支持您所声称的答案。如果无法复制代码结果,则可以通过复制和粘贴甚至丝网印刷来支持答案。
灰色

0

就我而言,Hermes从未启用过,但是我遇到了此错误。清洁(通过Android Studio)并重建解决了该错误。


通过Android Studio进行清洁与通过./gradlew clean进行清洁有区别吗?
Andru

0

尝试在app / build.gradle中替换您的ndk对象

defaultConfig {
...
    ndk {
        abiFilters "armeabi-v7a", "x86"
    }
}

0

当我尝试在0.60之前的较早版本的React Native上运行时,遇到了此错误,而在其中package.json定义了较新的版本(0.60之后)。


0

更新Android Studio之后发生在我身上,然后我再次清理并构建,它不再崩溃。


-1

就我而言,只需enableHermes在中打开app/build.gradle

project.ext.react = [
    entryFile   : "index.js",
    enableHermes: true,  // HERE!
]

如果您打开爱马仕你只需要改变构建选项,它会取代SoLoader爱马仕和爱马仕通过构建做出...但它是不固定的
卢卡斯Šálek

-1

如果即使尝试了上述所有步骤后,仍然有人仍然遇到问题,那么这里是解决方案

在MainApplication.java中,添加以下导入:

import com.facebook.react.BuildConfig;

警告!如果您使用的是Expo裸机工作流程,请不要添加该导入。它会弄乱BuildConfig.DEBUG值,并使您的调试版本不再起作用。
Andru

-2

用简单的方法解决这个问题。

apply plugin: "com.android.application"
// def useIntlJsc = false

import com.android.build.OutputFile
project.ext.react = [
    entryFile: "index.js",
    bundleInStaging: true,       // Add this
    bundleInInternalTest: true,  // Add this
    bundleInRelease: true
]

apply from: "../../node_modules/react-native/react.gradle"

def enableSeparateBuildPerCPUArchitecture = false

def enableProguardInReleaseBuilds = false

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

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

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        applicationId "com.inbox.clean.free.gmail.unsubscribe.smart.email.fresh.mailbox"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 2597205 //4242929
        versionName "1.6.3"
        multiDexEnabled true
        ndk {
            //  abiFilters "armeabi-v7a", "x86"
                //   abiFilters.clear()

        }

    }

    signingConfigs {
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }
    }
    buildTypes {

        release {
            minifyEnabled enableProguardInReleaseBuilds
            shrinkResources enableSeparateBuildPerCPUArchitecture
            proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
            signingConfig signingConfigs.release
        }
    }



    project.ext.sentryCli = [
        logLevel: "debug",
        flavorAware: false,
        //add
         enableHermes: false
    ]




    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }


    splits {
        abi {
            reset()
            enable true
            universalApk false  // If true, also generate a universal APK
            include "armeabi-v7a","arm64-v8a","x86","x86_64"
            //"armeabi-v7a" "arm64-v8a" "x86" "x86_64"
            // include "armeabi-v7a", "x86"
            exclude "ldpi", "xxhdpi", "xxxhdpi"
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            // For each separate APK per architecture, set a unique version code as described here:
            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
            def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a":3,"x86_64":4]
            def abi = output.getFilter(OutputFile.ABI)
            if (abi != null) {  // null for the universal-debug, universal-release variants
                output.versionCodeOverride =
                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
            }
        }
    }
}

dependencies {
    implementation project(':react-native-linear-gradient')
    implementation fileTree(dir: "libs", include: ["*.jar"])

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

}

// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.compile
    into 'libs'
}

apply plugin: 'com.google.gms.google-services'

4
我认为这太简单了!
哈尼

@Chaurasia您做了什么来解决这个问题?解决此问题的线是什么?
Kruupös

@Kruupös我只显示我的文件指令。这个文件是一个很好的方法。用户可以将自己的文件匹配到我的文件吗?很简单。
Chaurasia

1
@Chaurasia并非如此,我有一些与您的要求不符的特定配置,一个真正的答案是了解导致或解决问题的确切路线。我什至不知道您的React版本,所以就不那么简单了。
Kruupös
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.