React-Native: java.lang.UnsatisfiedLinkError: не вдалося знайти DSO для завантаження: libhermes.so


86

Я щойно оновив свій проект, використовуючи рідну версію 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 : З цією зміною додатки React Native самі повинні почати використовувати AndroidX. Їх не можна використовувати паралельно в одній програмі, тому весь код програми та код залежності повинні використовувати той чи інший. Це може бути так для вас?
AsifM

Відповіді:


62

У мене була та сама проблема після оновлення з 0,59,8 до 0,60,4

Переконайтеся, що ви додали всі ці рядки у свій додаток / 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")
    }

13
У мене це не спрацювало після оновлення до 0.60.4. Я пробував чистити кілька разів. Здається, я не можу відключити гермес. Я отримую аварію при запуску "не вдалося знайти DSO для завантаження: libhermes.so"
Ed of the Mountain

3
Переконайтеся, що в src / android / build.gradle ви також додали репозитарій maven для lib hermes (як пропонується в іншій відповіді). Це може бути пов’язано з JavaScriptCore і не конкретно з Гермесом
Vinzzz,

Дякую! Мені не вистачало "maven {url (" $ rootDir /../ node_modules / jsc-android / dist ")}
Ed of the Mountain,

Спасибі !! Його робоча форма мені, але не забудьте додати цей блок у проект build.gradle maven {// АТ Android встановлюється з url npm ("$ rootDir /../ node_modules / jsc-android / dist")}
Vishal Gadhiya

4
У React-native 0.61 частина hermesvm в android / app / build.gradle переїхала до hermes-engine: github.com/facebook/react-native/blob/0.61-stable/template/…
Mike Hardy

25

Я додав цей блок у блок allProject у project_dir / build.gradle, і збій зник.

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

Що я зробив, це створив новий проект з реактивним init та пройшов через файли збірки android. На щастя, це була перша різниця, яку я помітив і виправив свою проблему. Я думаю, ви могли б зробити те саме, якщо це не допомогло.


@msqar те саме тут
0x01Brain

2
Додавання цього рядка спричинило таку помилку під час збірки:error: package com.facebook.react.module.annotations does not exist
0x01Brain

1
Перевірка змін тут може бути гарною ідеєю response-native-community.github.io/upgrade-helper
P-RAD

25

Я щойно почистив папку збірки для android, і після цього вона працювала нормально. Сподіваюся, це допомагає спаровуватися.

cd android
./gradlew clean 

годин налагодження та пошуку, і це було виправлено чистим ...
tibbus

2
так, було дуже невтішно виявити, що це було абсурдним виправленням
samernady

У мене завжди виникає ця помилка, коли я створюю
пакетний

Я думаю, що ця проблема почалася, коли я оновив версію nodejs. У будь-якому разі це виправило мою проблему!
Король Жульєн

9
  1. відкрити node_modules / jsc-android / README.md
  2. знайти розділ "Як використовувати його з моїм рідним додатком для реагування"

наприклад:

  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
}

я виконав вищезазначений спосіб, не використовуючи упаковки, і цього досить. Дякую.
огужан

Для мене мені просто потрібно було додати pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
dazza5000

Довгі дослідження для пошуку відповіді. Дякую за рішення.
Р.Мохандрадж

8

Якщо під час оновлення до рідної версії 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 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] Власна директорія lib: /data/app/com.tootitoo.tootitoo-1/lib/arm результат : 0
Кіо Куросагі,

7

я вирішив це, додавши

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

Де саме ви додали це та в якому файлі?
Андру,

1
app/build.gradleвсередині кінцяdependencies { } dependencies { implementation project(':react-native-permissions') configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" } } }
dasl

4

Для інших, які стикаються з цим випуском, є 2 розділи, які виглядають схожими. Вам потрібно оновити нижній 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
я щойно додав url ("$ rootDir /../ node_modules / jsc-android / dist") у проект gradle. дякую Eliezer Steinbock
Guru

3

Додайте це у свій проект рівня рівня

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()
    }
}

3

Більше я нічого не робив. ./gradlew cleanвирішив мою проблему.


коли ви офіційно публікуєте відповідь на старіше запитання. Було б дуже корисно, якщо ви підтримаєте свою передбачувану відповідь деяким кодом та результатами, отриманими в результаті використання вашого коду. Ви можете підтримати свою відповідь копіюванням та вставленням або навіть трафаретною роздруківкою, якщо результат з вашого коду не вдається скопіювати.
Сірий

2

Після безуспішного виконання всіх порад я створив * .apk замість * .aab. APK становить 16 МБ, на відміну від 8 МБ AAB, але нарешті я позбувся UnsatisfiedLinkError.

Щоб побудувати AAB (з аварією через UnsatisfiedLinkError):

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

Щоб створити файл .apk (без збоїв, і hermes також прекрасно працює):

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

Хоча це не постійне рішення, це тимчасове рішення, яке вирішило проблему для мене на даний момент. Дякую!
kentrh

0

У моєму випадку Гермеса ніколи не вмикали, і все ж я зіткнувся з цією помилкою. Очищення (через Android Studio) та відновлення відновили помилку.


Чи має значення чищення через Android Studio проти via ./gradlew clean?
Андру,


0

У мене виникла ця помилка, коли я намагався запустити стару версію React Native до 0,60, тоді як у package.jsonновій версії було визначено (пост 0,60).


0

Це трапляється зі мною після того, як я оновив свою андроїд-студію, потім я знову чищу і будую, більше не виходить з ладу.


0

Це тому, що 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


-1

У моєму випадку, просто поверніть enableHermesдалі в app/build.gradle:

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

Якщо ви ввімкнете Hermes, ви просто зміните параметри збірки, і це замінить SoLoader на Hermes і зробить збірку через Hermes ... але це не виправлено
Lukáš Šálek

-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

-2

Якщо хтось все ще стикається з проблемою, навіть після застосування всіх вищевказаних кроків, ось рішення

У MainApplication.java додайте цей імпорт:

import com.facebook.react.BuildConfig;

Увага! Не додавайте цей імпорт у випадку, якщо ви використовуєте відкритий робочий процес Expo. Це зіпсує BuildConfig.DEBUGцінність і змусить ваші збірки налагодження більше не працювати.
Андру

BuildConfig - це файл, який автоматично створюється для вашого проекту, вам не слід імпортувати файл із facebook.
Бруно Лемос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.