React-Native: java.lang.UnsatisfiedLinkError: no se pudo encontrar DSO para cargar: libhermes.so


83

Acabo de actualizar mi proyecto para usar la versión nativa de reacción 0.60.2 . Pero cuando intento ejecutar una aplicación en un dispositivo Android, se bloquea después de la pantalla de inicio. Obtuve los siguientes registros de errores:

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)

Pocas sugerencias disponibles aquí: https://github.com/facebook/react-native/issues/25601 pero desafortunadamente ninguna de ellas funcionó para mí. Sugiera la solución alternativa.


De v0.60 changelog / blog : Con este cambio, las aplicaciones React Native deberán comenzar a usar AndroidX por sí mismas. No se pueden usar uno al lado del otro en una aplicación, por lo que todo el código de la aplicación y el código de dependencia deben usar uno u otro. ¿Este podría ser un caso para ti?
— AsifM

Respuestas:


61

Tuve el mismo problema después de actualizar de 0.59.8 a 0.60.4

Asegúrese de haber agregado todas estas líneas en su aplicación / build.gradle , especialmente la parte de dependencias, ya que esto asegura que tenga JSC binary

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
    }

EDITAR

Además, asegúrese de que el repositorio de Hermes Maven esté en su construcción raíz .

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

11
Esto no funcionó para mí después de actualizar a 0.60.4. Intenté limpiar varias veces. Parece que no puedo desactivar hermes. Me bloqueo al iniciar "No pude encontrar DSO para cargar: libhermes.so"
— Ed of the Mountain

3
Asegúrese de que en src / android / build.gradle, también haya agregado el repositorio de maven para hermes libs (como propone la otra respuesta). Podría estar relacionado con JavaScriptCore y no con Hermes específicamente
— Vinzzz

¡Gracias! Me faltaba "maven {url (" $ rootDir /../ node_modules / jsc-android / dist ")}
— Ed of the Mountain

Gracias !! Está funcionando para mí, pero no olvides agregar este bloque en el proyecto build.gradle maven {// Android JSC se instala desde npm url ("$ rootDir /../ node_modules / jsc-android / dist")}
— Vishal Gadhiya

4
En react-native 0.61, la parte hermesvm en android / app / build.gradle se ha trasladado a hermes-engine: github.com/facebook/react-native/blob/0.61-stable/template/…
— Mike Hardy

23

Agregué este bloque en el bloque allProject en project_dir / build.gradle y el bloqueo desapareció.

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

Lo que hice fue crear un nuevo proyecto con react-native init y revisé los archivos de compilación de Android. Afortunadamente, esta fue la primera diferencia que noté y solucionó mi problema. Supongo que podrías hacer lo mismo si esto no funciona.


@msqar lo mismo aquí
— 0x01Brain

2
Agregar esa línea provocó el siguiente error durante la compilación:error: package com.facebook.react.module.annotations does not exist
— 0x01Brain

1
Verificar los cambios aquí podría ser una buena idea react-native-community.github.io/upgrade-helper
— P-RAD

21

Acabo de limpiar la carpeta de compilación para Android y después de eso, funcionó bien. Espero que ayude a aparearse.

cd android
./gradlew clean 

horas de depuración y búsqueda y se solucionó con una limpieza ...
— tibbus

sí, fue muy decepcionante descubrir que era esta solución absurda
— samernady

Siempre tengo este error cuando creo un lanzamiento de paquete, necesito ejecutar limpio cada vez
— tibbus

8
  1. open node_modules / jsc-android / README.md
  2. busque la sección 'Cómo usarlo con mi aplicación React Native'

por ejemplo:

  1. modificar 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. modificar 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
}

Me he desempeñado anteriormente sin usar packagingOptions y eso es suficiente. Gracias.
— Oguzhan

Para mí, solo necesitaba agregar pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
— dazza5000

Investiga durante mucho tiempo para encontrar la respuesta. Gracias por la solucion
— R.Mohanraj

7

He resuelto esto agregando

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

¿Dónde agregaste esto exactamente y en qué archivo?
— Andru

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

5

En caso de que se enfrente a este error al actualizar a la versión React Native 0.62.2:

Agregue lo siguiente a su android/app/build.gradlearchivo:

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

como una de las primeras implementationentradas.

Solución tomada de aquí


1
Después de implementar todavía tengo este problema ---> no se pudo encontrar DSO para cargar: 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] Directorio lib nativo: /data/app/com.tootitoo.tootitoo-1/lib/arm resultado : 0
— Kyo Kurosagi

Recibo el mismo error, ¿podrías resolverlo?
— Hugo Pretorius

¿alguno de ustedes podría resolver esto? @HugoPretorius
— Diego Rivera

4

Para otros que se encuentran con este problema, hay 2 secciones que se ven similares. ¡Necesitas actualizar la repositoriessección inferior en 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
Acabo de agregar url ("$ rootDir /../ node_modules / jsc-android / dist") en el proyecto gradle. gracias Eliezer Steinbock
— Guru

3

Agregue esto en su nivel de proyecto 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

Después de seguir todos los consejos sin éxito, construí un * .apk en lugar de un * .aab. El APK es de 16 MB en comparación con los 8 MB de AAB, pero finalmente me deshice del UnsatisfiedLinkError.

Para construir un AAB (bloqueado con UnsatisfiedLinkError):

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

Para construir un APK (sin fallas y hermes también funciona bien):

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

Aunque esta no es una solución permanente, es una solución temporal que me solucionó el problema por ahora. ¡Gracias!
— Kentrh

2

No hice nada más. ./gradlew cleanresolvió mi problema.


desde que está publicando formalmente una respuesta a una pregunta anterior. Sería muy útil que respalde su supuesta respuesta con algo de código y la salida que resulta de usar su código. Puede respaldar su respuesta con copiar y pegar o incluso una impresión de pantalla si el resultado de su código no se puede copiar.
— Gray

0

En mi caso, Hermes nunca se habilitó y, sin embargo, encontré este error. La limpieza (a través de Android Studio) y la reconstrucción resolvieron el error.


¿La limpieza a través de Android Studio frente a la vía ./gradlew cleanmarca la diferencia?
— Andru

0

Intente reemplazar su objeto ndk dentro de la aplicación / build.gradle

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

0

Tuve este error cuando intentaba ejecutar con una versión anterior de React Native, antes de 0.60, mientras que package.jsontenía una versión más nueva definida (publicación 0.60).


0

Me pasa después de actualizar mi estudio de Android, luego limpio y construyo nuevamente, ya no se bloquea.


-1

En mi caso, sólo se conecta el enableHermesencendido en app/build.gradle:

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

Si enciende Hermes, simplemente cambia las opciones de compilación y reemplazará SoLoader a Hermes y hará la compilación a través de Hermes ... pero no está arreglado
— Lukáš Šálek

-1

Si alguien sigue enfrentando el problema incluso después de aplicar y probar todos los pasos anteriores, aquí está la solución

En MainApplication.java, agregue esta importación:

import com.facebook.react.BuildConfig;

¡Advertencia! No agregue esa importación en caso de que esté utilizando el flujo de trabajo básico de Expo. Arruinará el BuildConfig.DEBUGvalor y hará que sus compilaciones de depuración ya no funcionen.
— Andru

-2

Resuelve este problema de forma sencilla.

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
¡Creo que es demasiado simple!
— Hani

@Chaurasia, ¿qué hiciste para solucionar este problema? ¿Cuáles son las líneas que resolvieron esto?
— Kruupös

@ Kruupös Solo muestro las instrucciones de mi archivo. este archivo está funcionando bien. ¿Puede el usuario hacer coincidir archivos propios con mi archivo? tan sencillo.
— Chaurasia

1
@Chaurasia no realmente, tengo una configuración específica que no coincidiría con sus requisitos. Una respuesta real sería comprender qué línea precisa está causando o resolviendo el problema. Ni siquiera conozco tu versión de React, así que no es tan simple.
— Kruupös
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.