React-Native: java.lang.UnsatisfiedLinkError: DSO zum Laden konnte nicht gefunden werden: libhermes.so


83

Ich habe gerade mein Projekt aktualisiert, um die reaktionsnative Version 0.60.2 zu verwenden . Wenn ich jedoch versuche, eine Anwendung auf einem Android-Gerät auszuführen, stürzt sie nach dem Startbildschirm ab. Ich habe die folgenden Fehlerprotokolle erhalten:

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)

Einige Vorschläge sind hier verfügbar: https://github.com/facebook/react-native/issues/25601, aber leider hat keiner von ihnen für mich funktioniert. Bitte schlagen Sie die Problemumgehung vor.


Ab v0.60 Changelog / Blog : Mit dieser Änderung müssen React Native-Apps AndroidX selbst verwenden. Sie können nicht nebeneinander in einer App verwendet werden, daher muss der gesamte App-Code und der Abhängigkeitscode den einen oder anderen verwenden. Dies könnte ein Fall für Sie sein?
AsifM

Antworten:


61

Ich hatte das gleiche Problem nach dem Upgrade von 0,59,8 auf 0,60,4

Stellen Sie sicher, dass Sie alle diese Zeilen in Ihrer app / build.gradle hinzugefügt haben , insbesondere den Abhängigkeitsteil, da dies sicherstellt, dass Sie über JSC-Binärdateien verfügen

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
    }

BEARBEITEN

Stellen Sie außerdem sicher, dass sich das Hermes Maven-Repo in Ihrem root build.gradle befindet

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

11
Dies funktionierte bei mir nach dem Upgrade auf 0.60.4 nicht. Ich habe es mehrmals sauber gemacht. Ich kann Hermes nicht deaktivieren. Ich bekomme einen Absturz beim Start "DSO konnte nicht zum Laden gefunden werden: libhermes.so"
Ed of the Mountain

3
Stellen Sie sicher, dass Sie in src / android / build.gradle auch das Maven-Repo für Hermes Libs hinzugefügt haben (wie in der anderen Antwort vorgeschlagen). Es könnte mit JavaScriptCore & nicht speziell Hermes verwandt sein
Vinzzz

Vielen Dank! Mir fehlte "maven {url (" $ rootDir /../ node_modules / jsc-android / dist ")}
Ed of the Mountain

Danke !! Es funktioniert von mir, aber vergessen Sie nicht, diesen Block im Projekt build.gradle maven hinzuzufügen. {// Android JSC wird von der npm-URL ("$ rootDir /../ node_modules / jsc-android / dist")}
Vishal Gadhiya installiert

4
In React-Native 0.61 wurde der Hermesvm-Teil in android / app / build.gradle auf Hermes-Engine verschoben: github.com/facebook/react-native/blob/0.61-stable/template/…
Mike Hardy

23

Ich habe diesen Block im allProject-Block in project_dir / build.gradle hinzugefügt und der Absturz ist verschwunden.

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

Was ich getan habe, ist, ein neues Projekt mit reaktionsnativen Init zu erstellen und die Android-Build-Dateien durchzugehen. Glücklicherweise war dies der erste Unterschied, den ich bemerkte und mein Problem behebte. Ich denke, Sie könnten das Gleiche tun, wenn dies nicht funktioniert.


@msqar gleiche hier
0x01Brain

2
Das Hinzufügen dieser Zeile verursachte den folgenden Fehler während des error: package com.facebook.react.module.annotations does not exist
Builds

1
Das Überprüfen der Änderungen hier könnte eine gute Idee sein. React-native-community.github.io/upgrade-helper
P-RAD

21

Ich habe gerade den Build-Ordner für Android bereinigt und danach hat es gut funktioniert. Hoffe das hilft sich zu paaren.

cd android
./gradlew clean 

Stunden des Debuggens und Durchsuchens und es wurde durch einen sauberen ...
tibbus

Ja, es war sehr enttäuschend zu sehen, dass es diese absurde Lösung war
Samernady

Ich habe immer diesen Fehler, wenn ich eine Bundle-Version erstelle, die jedes Mal sauber laufen muss
tibbus

8
  1. öffne node_modules / jsc-android / README.md
  2. Finden Sie den Abschnitt 'Wie verwende ich es mit meiner React Native App?'

zum Beispiel:

  1. Ändern Sie 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. Ändern Sie 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
}

Ich habe oben ohne VerpackungOptions durchgeführt und das ist genug. Vielen Dank.
Oguzhan

Für mich musste ich nur hinzufügen pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
dazza5000

Langjährige Recherche, um die Antwort zu finden. Danke für die Lösung.
R. Mohanraj

7

Ich habe dies durch Hinzufügen gelöst

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

Wo genau haben Sie das hinzugefügt und in welcher Datei?
Andru

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

5

Falls Sie beim Aktualisieren auf die React Native-Version auf diesen Fehler stoßen 0.62.2:

Fügen Sie Ihrer android/app/build.gradleDatei Folgendes hinzu :

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

als einer der ersten implementationEinträge.

Lösung von hier genommen


1
Nach der Implementierung ist dieses Problem immer noch aufgetreten ---> DSO konnte nicht geladen werden: 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 result : 0
Kyo Kurosagi

Ich erhalte den gleichen Fehler. Können Sie das beheben?
Hugo Pretorius

Könnte jemand von euch das lösen? @ HugoPretorius
Diego Rivera

4

Für andere, die auf dieses Problem stoßen, gibt es zwei Abschnitte, die ähnlich aussehen. Sie müssen den unteren repositoriesBereich in aktualisieren 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
Ich habe gerade URL ("$ rootDir /../ node_modules / jsc-android / dist") in Projekt Gradle hinzugefügt. danke Eliezer Steinbock
Guru

3

Fügen Sie dies in Ihren Gradle auf Projektebene ein

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

Nachdem ich alle Ratschläge ohne Erfolg befolgt hatte, baute ich eine * .apk anstelle einer * .aab. Die APK ist 16 MB im Gegensatz zur 8 MB AAB, aber ich habe endlich den UnsatisfiedLinkError losgeworden.

So erstellen Sie ein AAB (abgestürzt mit UnsatisfiedLinkError):

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

So erstellen Sie eine APK (kein Absturz und Hermes funktionieren auch gut):

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

Obwohl dies keine dauerhafte Lösung ist, ist es eine vorübergehende Umgehung, die das Problem für mich vorerst behoben hat. Vielen Dank!
8.

2

Ich habe nichts mehr getan. ./gradlew cleanlöste mein Problem.


Sobald Sie offiziell eine Antwort auf eine ältere Frage veröffentlichen. Es wäre sehr hilfreich, wenn Sie Ihre angebliche Antwort mit etwas Code und der Ausgabe unterstützen würden, die sich aus der Verwendung Ihres Codes ergibt. Sie können Ihre Antwort durch Kopieren und Einfügen oder sogar durch einen Siebdruck unterstützen, wenn das Ergebnis Ihres Codes nicht kopiert werden kann.
Grauer

0

In meinem Fall wurde Hermes nie aktiviert und dennoch trat dieser Fehler auf. Durch Bereinigen (über Android Studio) und Wiederherstellen wurde der Fehler behoben.


Macht die Reinigung über Android Studio oder über Via ./gradlew cleaneinen Unterschied?
Andru

0

Versuchen Sie, Ihr ndk-Objekt in app / build.gradle zu ersetzen

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

0

Ich hatte diesen Fehler, als ich versuchte, mit einer älteren Version von React Native vor 0.60 zu laufen, während in der package.jsoneine neuere Version definiert war (nach 0.60).


0

Es passiert mir, nachdem ich mein Android Studio aktualisiert habe, dann bereinige und baue ich es erneut, es stürzt nicht mehr ab.


-1

In meinem Fall, schalten Sie einfach die enableHermesauf in app/build.gradle:

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

Wenn Sie Hermes einschalten, ändern Sie einfach die Build-Optionen und es wird SoLoader durch Hermes ersetzen und Build über Hermes erstellen ... aber es ist nicht behoben
Lukáš Šálek

-1

Wenn jemand auch nach dem Anwenden aller oben genannten Schritte immer noch mit dem Problem konfrontiert ist, finden Sie hier die Lösung

Fügen Sie in der Datei MainApplication.java diesen Import hinzu:

import com.facebook.react.BuildConfig;

Warnung! Fügen Sie diesen Import nicht hinzu, wenn Sie den Expo Bare Workflow verwenden. Dies wird den BuildConfig.DEBUGWert durcheinander bringen und dazu führen, dass Ihre Debug-Builds nicht mehr funktionieren.
Andru

-2

Lösen Sie dieses Problem auf einfache Weise.

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
Es ist zu einfach, denke ich !!
Hani

@Chaurasia Was hast du getan, um dieses Problem zu lösen? Was sind die Zeilen, die dies gelöst haben?
Kruupös

@ Kruupös Ich zeige nur meine Datei Anweisung. Diese Datei funktioniert gut. Kann der Benutzer eigene Dateien mit meiner Datei abgleichen? so einfach.
Chaurasia

1
@Chaurasia nicht wirklich, ich habe eine bestimmte Konfiguration, die nicht Ihren Anforderungen entspricht. Eine echte Antwort wäre zu verstehen, welche genaue Linie das Problem verursacht oder löst. Ich kenne Ihre React-Version nicht einmal, also nicht so einfach.
Kruupös
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.