ChatGPT解决这个技术问题 Extra ChatGPT

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

我刚刚更新了我的项目以使用 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。它们不能在一个应用程序中并排使用,因此所有应用程序代码和依赖项代码都需要使用其中一个。这可能是你的情况?

V
Vinzzz

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

升级到 0.60.4 后,这对我不起作用。我多次尝试清洁。我似乎无法禁用爱马仕。我在启动时崩溃“找不到要加载的 DSO:libhermes.so”
确保在 src/android/build.gradle 中,您还为 hermes 库添加了 maven 存储库(就像其他答案所建议的那样)。它可能与 JavaScriptCore 而不是 Hermes 相关
谢谢!我错过了“maven { url("$rootDir/../node_modules/jsc-android/dist") }
感谢 !!它的工作形式是我,但不要忘记在项目 build.gradle maven 中添加这个块 { // Android JSC 是从 npm url 安装的("$rootDir/../node_modules/jsc-android/dist") }
在 react-native 0.61 中,android/app/build.gradle 中的 hermesvm 部分已移至 hermes-engine: github.com/facebook/react-native/blob/0.61-stable/template/…
s
samernady

我刚刚清理了 android 的构建文件夹,之后,它运行良好。希望对伴侣有所帮助。

cd android
./gradlew clean 

经过数小时的调试和搜索,它被一个干净的…
是的,发现这是一个荒谬的解决方案,真是令人失望
创建捆绑版本时总是出现此错误,每次都需要运行干净
我认为这个问题是在我升级 nodejs 版本时开始的。无论如何,这解决了我的问题!
s
skang

我在 project_dir/build.gradle 的 allProject 块中添加了这个块,崩溃就消失了。

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

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


@msqar 这里也一样
添加该行在构建期间导致以下错误:error: package com.facebook.react.module.annotations does not exist
在此处验证更改可能是个好主意react-native-community.github.io/upgrade-helper
A
Andru

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

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

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

作为前 implementation 个条目之一。

Solution taken from here


实施后仍然有这个问题--->找不到要加载的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] Native lib dir: /data/app/com.tootitoo.tootitoo-1/lib/arm 结果: 0
S
Starryi

打开 node_modules/jsc-android/README.md 找到“如何将它与我的 react Native 应用程序一起使用”部分

例如:

修改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()

    }
}

修改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 的情况下执行了上述方式,这就足够了。谢谢。
对我来说,我只需要添加 pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
长期研究寻找答案。感谢您的解决方案。
OMFG 如果可以的话,我会在十亿次@#$%ing 次投票!我以为我已经疯了好几个小时了;尝试了以上所有答案的建议并添加第二个 maven repo 链接终于解决了!仅拥有其中一个是不够的。 TYSM! :D
这是我唯一的解决方案。
d
dasl

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

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

你到底在哪里添加了这个,在哪个文件中?
app/build.gradledependencies { } dependencies { implementation project(':react-native-permissions') configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" } } } 的末端内
E
Eliezer Steinbock

对于遇到此问题的其他人,有 2 个部分看起来相似。您需要更新 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()
    }
}

我刚刚在项目 gradle 中添加了 url("$rootDir/../node_modules/jsc-android/dist") 。谢谢埃利泽·斯坦博克
J
Jack Ou

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


因为您正式发布了对较旧问题的答案。您最好用一些代码和使用您的代码产生的输出来支持您声称的答案。如果无法复制代码的结果,您可以通过复制和粘贴甚至屏幕打印来支持您的答案。
m
michael_vons

这是因为 SOLoader 不存在。

确保

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

在 android/app/build.gradlle 的依赖项下添加

清理你的构建

cd android

./gradlew clean

尝试捆绑 ./gradlew bundleRelease

退出 android 文件夹 cd ../

尝试运行 npx react-native run-android --variant=release


就我而言,我错过了 releaseImplementation 'com.facebook.soloader:soloader:0.9.0+'
@michael_vons 感谢您的解决方案。对于似乎突然停止工作的任何人,它都可以在 Android Studio 中构建,并且 react-native run-android 将适用于 30 以下的 API,但对于 30 及以上的 API,我需要像 Michael 一样添加 implementation'com.facebook.soloader:soloader:0.9.0+'说并按照他的其余说明使用 react-native 构建它。此外,在构建/启动 react-native 应用程序时在 Android Studio 中打开 logcat 可以让我找到问题,因为 Metro 没有吐出任何错误,并且应用程序在构建时立即崩溃。
A
Abhinav Saxena

将此添加到您的项目级别 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()
    }
}

H
Henrik

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

要构建 AAB(因 UnsatisfiedLinkError 而崩溃):

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

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

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

虽然这不是一个永久的解决方案,但它是一个临时的解决方法,暂时为我解决了这个问题。谢谢!
P
Piotr Badura

在我的情况下,我需要为每个 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
    }

I
Isaac Overacker

就我而言,Hermes 从未启用,但我遇到了这个错误。清理(通过 Android Studio)和重建解决了错误。


通过 Android Studio 与通过 ./gradlew clean 进行清理有区别吗?
u
user3571779

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

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

S
Sir Codesalot

当我尝试使用 0.60 之前的旧版本的 React Native 运行时,我遇到了这个错误,而在 package.json 中定义了一个较新的版本(0.60 之后)。


E
Elan

它发生在我更新我的 android studio 之后,然后我清理并再次构建,它不再崩溃。


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

&

确保您已安装 - https://www.npmjs.com/package/jsc-android

就我而言,由于某种原因,它不存在。


t
tryp

为了避免这种意外行为,我选择在我的所有项目中使用 fastlane(很容易实现和使用)。每次我寻找新版本时,我都创建了一条短通道来清除项目。

lane :clean do
    gradle(
      task: "clean"
    )
end

然后我在我的生产通道命令中使用这个通道

lane :release do
  check_env
  bump
  ...
  clean
  gradle(
    task: 'bundle',
    build_type: 'Release'
  ) 
end

l
lfree

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

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

如果您打开 Hermes,您只需更改构建选项,它会将 SoLoader 替换为 Hermes 并通过 Hermes 进行构建......但它不是固定的
M
Moaz Khan

如果任何人在尝试上述所有步骤后仍然面临问题,那么这里是解决方案

在 MainApplication.java 中,添加这个导入:

import com.facebook.react.BuildConfig;

警告!如果您使用 Expo 裸工作流,请不要添加该导入。它会弄乱 BuildConfig.DEBUG 值并使您的调试版本不再工作。
BuildConfig 是为您的项目自动生成的文件,您不应从 facebook 导入该文件。
P
Pmpr.ir

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

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'

我觉得太简单了!!
@Chaurasia 你做了什么来解决这个问题?解决这个问题的方法是什么?
@Kruupös 我只显示我的文件说明。这个文件的工作方式很好。用户可以将自己的文件与我的文件匹配吗?很简单。
@Chaurasia 不是真的,我有一些不符合您要求的特定配置。真正的答案是了解导致或解决问题的确切线路。我什至不知道你的 React 版本,所以没那么简单。