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.

V-Xtreme
fuente
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")
    }
Vinzzz
fuente
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.

skang
fuente
@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 
Samernady
fuente
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
}
Kun Guan
fuente
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"
    }
}
dasl
fuente
¿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í

Andru
fuente
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()
    }
}
Eliezer Steinbock
fuente
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()
    }
}
kishan verma
fuente
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
Henrik
fuente
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.

Jack Au
fuente
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.

Isaac Overacker
fuente
¿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"
    }
}
usuario3571779
fuente
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).

Sir Codesalot
fuente
0

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

Vivacidad
fuente
-1

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

project.ext.react = [
    entryFile   : "index.js",
    enableHermes: true,  // HERE!
]
libre
fuente
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;
Moaz Khan
fuente
¡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'
Chaurasia
fuente
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