प्रतिक्रिया-मूल: java.lang.UnsatisfiedLinkError: लोड करने के लिए DSO नहीं मिल सकता है: libhermes.so


86

मैंने अपनी परियोजना को केवल प्रतिक्रिया-देशी संस्करण 0.60.2 का उपयोग करने के लिए अद्यतन किया है । लेकिन जब मैं एंड्रॉइड डिवाइस पर एक एप्लिकेशन चलाने की कोशिश कर रहा हूं तो यह लॉन्च स्क्रीन के बाद क्रैश हो जाता है। मुझे निम्नलिखित त्रुटि लॉग मिले:

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 बदलाव का / ब्लॉग : इस बदलाव के साथ, प्रतिक्रिया मूल निवासी क्षुधा AndroidX खुद को उपयोग शुरू करने की आवश्यकता होगी। उन्हें एक ऐप में साइड-बाय-साइड इस्तेमाल नहीं किया जा सकता है, इसलिए ऐप कोड और निर्भरता कोड के सभी को एक या दूसरे का उपयोग करने की आवश्यकता है। यह आपके लिए एक मामला हो सकता है?
आसिफ़ जुले

जवाबों:


62

0.59.8 से 0.60.4 पर अपग्रेड करने के बाद मेरे पास यही मुद्दा था

सुनिश्चित करें कि आपने अपने ऐप / बिल्ड.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
    }

संपादित करें

इसके अलावा, सुनिश्चित करें कि हेमीज़ मावेन रेपो आपके रूट बिल्ड.ग्रेडल में है

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

13
0.60.4 में अपग्रेड करने के बाद मेरे लिए यह काम नहीं किया। मैंने कई बार सफाई की कोशिश की। मैं उपदेश अक्षम नहीं कर सकता। मैं शुरू में क्रैश हो जाता है "लोड करने के लिए डीएसओ नहीं मिल सका: libhermes.so"
माउंटेन

3
सुनिश्चित करें कि src / android / build.gradle में, आपने हेर्मे लिबास के लिए मावेन रेपो भी जोड़ा है (जैसे अन्य उत्तर प्रस्तावित करता है)। यह विशेष रूप से JavaScriptCore &
Not

धन्यवाद! मुझे "मावेन {url (" $ rootDir /../ node_modules / jsc-android / dist ") याद आ रहा था}}
माउंट का संस्करण

धन्यवाद !! इसका काम कर प्रपत्र मुझे लेकिन भूल जाते हैं परियोजना build.gradle Maven में इस ब्लॉक में शामिल नहीं करना {// एंड्रॉयड जेएससी NPM यूआरएल ( "$ rootDir /../ node_modules / JSC-एंड्रॉयड / जिले") से स्थापित किया गया है}
विशाल Gadhiya

4
में एंड्रॉयड में प्रतिक्रिया देशी 0.61 hermesvm हिस्सा / ऐप्स / build.gradle में ले जाया गया हेमीज़ इंजन: github.com/facebook/react-native/blob/0.61-stable/template/...
माइक हार्डी

25

मैंने इस ब्लॉक को project_dir / build.gradle में allProject ब्लॉक में जोड़ा और क्रैश हो गया।

    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
यहाँ परिवर्तनों को सत्यापित करना एक अच्छा विचार हो सकता है प्रतिक्रिया-native-community.github.io/upgrad-helper
P-RAD

25

मैंने अभी-अभी android के लिए बिल्ड फ़ोल्डर को साफ किया है और उसके बाद, यह ठीक काम किया है। आशा है कि मदद करता है दोस्त।

cd android
./gradlew clean 

डिबगिंग के घंटे और खोजे गए और यह एक साफ द्वारा तय किया गया था ...
तिब्बत

2
हाँ, यह बहुत ही निराशाजनक था, यह बहुत ही निराशाजनक था
samernady

जब मैं एक बंडल रिलीज बनाता हूं तो मुझे हमेशा यह त्रुटि होती है, हर बार क्लीन रन करने की जरूरत होती है
tibbus

मुझे लगता है कि यह समस्या तब शुरू हुई जब मैंने नोडज संस्करण को अपग्रेड किया। वैसे भी यह मेरी समस्या तय!
राजा जूलियन

9
  1. नोड_मॉड्यूल / 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

प्रतिक्रियाशील मूल संस्करण में अपडेट करते समय आप इस त्रुटि का सामना कर रहे हैं 0.62.2:

अपनी android/app/build.gradleफ़ाइल में निम्न जोड़ें :

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

पहली implementationप्रविष्टियों में से एक के रूप में ।

समाधान यहाँ से लिया गया


1
लागू करने के बाद भी अभी भी यह मुद्दा है ---> लोड करने के लिए डीएसओ नहीं मिल सका: libhermes.so SoSource 0: com.facebook.soloader.ApkSoource [रूट = /data/data/com.tootitoot.tootitoo/lib-main झंडे = 1] SoSource 1: com.facebook.soloader.DirectorySoSource [रूट = /data/app/com.tootitoo.tootitoo-1/lib/arm झंडे = 0] SoSource 2: com.facebook.soloader.DirectorySoSource [रूट = / सिस्टम] / वेंडर / काम के झंडे = 2] SoSource 3: com.facebook.soloader.DirectorySoSource [जड़ = / प्रणाली / कामात्मक झंडे = 2] मूल निवासी परिवाद dir: /data/app/com.tootitit.tootitoo-1/lib/arm परिणाम : 0
Kyo Kurosagi

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 /../ नोड_मॉड्यूल्स / jsc-android / dist") जोड़ा है। आपको धन्यवाद Eliezer Steinbock
गुरु

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मेरी समस्या हल कर दी।


ince आप औपचारिक रूप से एक पुराने प्रश्न का उत्तर पोस्ट कर रहे हैं। यह सबसे अधिक मददगार होगा कि आप कुछ कोड और आउटपुट के साथ अपने कथित उत्तर का समर्थन करते हैं जो आपके कोड का उपयोग करने से उत्पन्न होता है। यदि आप अपने कोड से परिणाम की प्रतिलिपि नहीं बना सकते हैं तो आप अपने उत्तर का समर्थन कॉपी और पेस्ट या स्क्रीन प्रिंट के साथ कर सकते हैं।
ग्रे

2

सफलता के बिना सभी सलाह का पालन करने के बाद मैंने * .aab के बजाय * .apk का निर्माण किया। एपीके 8 एमबी एएबी के विपरीत 16 एमबी है, लेकिन मुझे अंततः असंतुष्ट लिंकइर्रर से छुटकारा मिल गया।

AAB बनाने के लिए (UnsatisfiedLinkError से दुर्घटनाग्रस्त):

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

एपीके बनाने के लिए (कोई क्रैश और हॉर्मेस ठीक काम नहीं करता है):

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

हालांकि यह एक स्थायी समाधान नहीं है, यह एक अस्थायी काम है, जिसने मेरे लिए अब इस मुद्दे को तय कर दिया है। धन्यवाद!
kentrh

0

मेरे मामले में, हेमीज़ कभी भी सक्षम नहीं था और फिर भी मुझे इस त्रुटि का सामना करना पड़ा। सफाई (एंड्रॉइड स्टूडियो के माध्यम से) और पुनर्निर्माण ने त्रुटि का समाधान किया।


एंड्रॉइड स्टूडियो बनाम सफाई के माध्यम से क्या ./gradlew cleanफर्क पड़ता है?
एंड्रू

0

एप्लिकेशन / build.gradle के अंदर अपने ndk ऑब्जेक्ट को बदलने का प्रयास करें

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

0

मुझे यह त्रुटि तब हुई जब मैं 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!
]

यदि आप हेमीज़ को चालू करते हैं तो आप केवल विकल्पों को बदल देते हैं और यह SoLoader को Hermes की जगह लेगा और Hermes के माध्यम से निर्माण करेगा ... लेकिन यह निश्चित नहीं है
Lukáš leá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 मैं केवल अपनी फ़ाइल निर्देश दिखा रहा हूं। यह फ़ाइल एक अच्छा तरीका काम कर रही है। क्या उपयोगकर्ता मेरी फ़ाइल से अपनी फ़ाइलों का मिलान कर सकता है? बहुत आसन।
चौरसिया

1
@ चौरसिया वास्तव में नहीं है, मेरे पास कुछ विशिष्ट कॉन्फ़िगरेशन हैं जो आपकी आवश्यकताओं से मेल नहीं खाते हैं। वास्तविक उत्तर यह समझना होगा कि सटीक रेखा क्या समस्या का कारण बन रही है या हल कर रही है। मैं आपके रिएक्ट संस्करण को भी नहीं जानता, इसलिए यह सरल नहीं है।
Kruupös

-2

यदि कोई भी ऊपर दिए गए सभी चरणों को आजमाने के बाद भी समस्या का सामना कर रहा है तो यहां समाधान है

MainApplication.java में, यह आयात जोड़ें:

import com.facebook.react.BuildConfig;

चेतावनी! यदि आप एक्सपो नंगे वर्कफ़्लो का उपयोग कर रहे हैं तो उस आयात को न जोड़ें। यह BuildConfig.DEBUGमूल्य को गड़बड़ कर देगा और आपके डिबग बिल्ड को काम नहीं करेगा।
एंड्रू

BuildConfig आपके प्रोजेक्ट के लिए स्वचालित रूप से जनरेट की गई फ़ाइल है, आपको फेसबुक से आयात नहीं करना चाहिए।
ब्रूनो लेमोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.