React-Native: java.lang.UnsatisfiedLinkError: yüklenecek DSO bulunamadı: libhermes.so


86

React -native 0.60.2 sürümünü kullanmak için projemi yeni güncelledim . Ancak Android cihazda bir uygulamayı çalıştırmaya çalıştığımda, başlatma ekranından sonra çöküyor. Aşağıdaki hata günlüklerini aldım:

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)

Burada mevcut birkaç öneri: https://github.com/facebook/react-native/issues/25601 ama ne yazık ki hiçbiri benim için işe yaramadı. Lütfen geçici çözümü önerin.


Gönderen v0.60 changelog / blog : Bu değişiklikle, yerel uygulamalar AndroidX kendileri kullanmaya başlaması gerekecektir yanıt verin. Bir uygulamada yan yana kullanılamazlar, bu nedenle tüm uygulama kodu ve bağımlılık kodunun birini veya diğerini kullanması gerekir. Bu senin için bir durum olabilir mi?
AsifM

Yanıtlar:


62

0.59.8'den 0.60.4'e yükselttikten sonra da aynı sorunu yaşadım

Tüm bu satırları app / build.gradle dosyanıza , özellikle bağımlılıklar kısmına eklediğinizden emin olun çünkü bu, JSC ikilisine sahip olduğunuzdan emin olmanızı sağlar.

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
    }

DÜZENLE

Ayrıca, Hermes Maven deposunun kök yapınızda olduğundan emin olun.

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

13
Bu, 0.60.4'e yükselttikten sonra benim için işe yaramadı. Birkaç kez temizlemeyi denedim. Hermes'i etkisiz hale getirmiş gibi görünmüyorum. Başlangıçta kilitleniyorum "yüklenecek DSO bulunamadı: libhermes.so"
Ed of the Mountain

3
Src / android / build.gradle dosyasında, hermes libs için maven deposunu da eklediğinizden emin olun (diğer yanıtın önerdiği gibi). JavaScriptCore ile ilgili olabilir ve özellikle Hermes ile ilgili olmayabilir
Vinzzz

Teşekkür ederim! "Maven {url (" $ rootDir /../ node_modules / jsc-android / dist ")} eksikti
Ed of the Mountain

Teşekkür !! Benden çalışıyor, ancak bu bloğu build.gradle maven projesine eklemeyi unutmayın {// Android JSC npm url'den ("$ rootDir /../ node_modules / jsc-android / dist")}
yüklenir

4
React-native 0.61'de android / app / build.gradle'daki hermesvm bölümü hermes-engine'e taşındı: github.com/facebook/react-native/blob/0.61-stable/template/…
Mike Hardy

25

Bu bloğu project_dir / build.gradle içindeki allProject bloğuna ekledim ve çökme gitti.

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

Yaptığım şey, react-native init ile yeni proje oluşturmak ve android yapı dosyalarını incelemek oldu. Neyse ki bu fark ettiğim ve sorunumu çözdüğüm ilk farktı. Sanırım bu işe yaramazsa sen de aynısını yapabilirsin.


@msqar burada aynı
0x01Brain

2
İnşa sırasında hat aşağıdaki hataya neden olduğunu ekleme:error: package com.facebook.react.module.annotations does not exist
0x01Brain

1
Buradaki değişiklikleri doğrulamak iyi bir fikir olabilir react-native-community.github.io/upgrade-helper
P-RAD

25

Derleme klasörünü android için temizledim ve bundan sonra iyi çalıştı. Umarım bu çiftleşmeye yardımcı olur.

cd android
./gradlew clean 

saatlerce hata ayıklama ve arama yapıldı ve temiz bir şekilde düzeltildi ...
tibbus

2
evet çok bulmak için bu saçma düzeltme oldu hayal kırıklığı
samernady

Bir paket sürümü oluşturduğumda her zaman bu hatayı alıyorum, her seferinde temiz çalışmam gerekiyor
tibbus

Sanırım bu problem nodejs sürümünü yükselttiğimde başladı. Neyse bu benim sorunumu çözdü!
Kral Julien

9
  1. açık node_modules / jsc-android / README.md
  2. 'React Native uygulamamla nasıl kullanılır' bölümünü bulun

Örneğin:

  1. android / build.gradle'ı değiştir
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'ı değiştir
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
}

PackagingOptions kullanmadan yukarıdaki şekilde yaptım ve bu yeterli. Teşekkürler.
oguzhan

Benim için eklemem gerekiyor pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
dazza5000

Cevabı bulmak için uzun süreli araştırma. Çözüm için teşekkürler.
R.Mohanraj

8

React Native sürümüne güncelleme yaparken bu hatayla karşılaşmanız durumunda 0.62.2:

Aşağıdakileri android/app/build.gradledosyanıza ekleyin :

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

ilk implementationgirdilerden biri olarak .

Buradan alınan çözüm


1
Uygulamadan sonra hala bu sorun var ---> yüklenecek DSO bulunamadı: 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] Yerel kitaplık dizini: /data/app/com.tootitoo.tootitoo-1/lib/arm sonucu : 0
Kyo Kurosagi

7

ekleyerek çözdüm

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

Bunu tam olarak nereye eklediniz ve hangi dosyaya?
Andru,

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

4

Bu sorunla karşılaşan diğerleri için, benzer görünen 2 bölüm var. Sen alt güncellemeniz gerekir repositoriesbölümüne 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
az önce gradle projesine url ("$ rootDir /../ node_modules / jsc-android / dist") ekledim. teşekkür ederim Eliezer Steinbock
Guru

3

Bunu proje düzeyindeki notunuza ekleyin

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

Ben daha fazlasını yapmadım. ./gradlew cleansorunumu çözdüm.


çünkü resmi olarak eski bir soruya cevap gönderiyorsunuz. Sözde cevabınızı bazı kodlarla ve kodunuzun kullanımından kaynaklanan çıktılarla desteklemeniz çok yararlı olacaktır. Yanıtınızı kopyalayıp yapıştırarak veya hatta kodunuzun sonucu kopyalanamıyorsa bir ekran baskısıyla destekleyebilirsiniz.
Grey

2

Başarı olmadan tüm tavsiyeleri uyguladıktan sonra * .aab yerine * .apk oluşturdum. APK, 8 MB AAB'nin aksine 16 MB'tır, ancak sonunda UnsatisfiedLinkError'dan kurtuldum.

Bir AAB oluşturmak için (UnsatisfiedLinkError ile çöktü):

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

Bir APK oluşturmak için (çökme yok ve hermes de iyi çalışıyor):

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

Bu kalıcı bir çözüm olmasa da, şimdilik sorunu benim için çözen geçici bir çözüm. Teşekkürler!
kentrh

0

Benim durumumda, Hermes hiçbir zaman etkinleştirilmedi ve yine de bu hatayla karşılaştım. Temizleme (Android Studio aracılığıyla) ve yeniden oluşturma, hatayı çözdü.


Android Studio ile temizlemeyle karşılaştırıldığında ./gradlew cleanbir fark yaratır mı?
Andru

0

Ndk nesnenizi app / build.gradle içinde değiştirmeyi deneyin

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

0

Bu hatayı, package.jsondaha yeni bir sürüm tanımlanmışken (0.60 sonrası) 0.60'dan önce React Native'in eski bir sürümüyle çalışmaya çalışırken yaşadım .


0

Android stüdyomu güncelledikten sonra bana oluyor, sonra tekrar temizleyip inşa ediyorum, artık çökmüyor.


0

Bunun nedeni SOLoader'ın olmamasıdır.

Sağlamak

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

android / app / build.gradlle'deki bağımlılıklar altına eklenir

yapınızı temizleyin

cd android

./gradlew clean

Gruplamayı deneyin ./gradlew bundleRelease

Android klasöründen çık cd ../

Koşmayı dene npx react-native run-android --variant=release


-1

Benim durumumda, sadece çevirmek enableHermesüzerinde app/build.gradle:

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

Hermes'i açarsanız, sadece yapı seçeneklerini değiştirirsiniz ve SoLoader'ı Hermes olarak değiştirir ve Hermes aracılığıyla inşa eder ... ancak bu sabit değildir
Lukáš Šálek

-2

Bu sorunu basit bir şekilde çözün.

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
Sanırım çok basit !!
Hani

@Chaurasia bu sorunu çözmek için ne yaptınız? bunu çözen satırlar neler?
Kruupös

@ Kruupös Sadece dosya talimatımı gösteriyorum. bu dosya iyi bir şekilde çalışıyor. kullanıcı kendi dosyalarını dosyamla eşleştirebilir mi? çok basit.
Chaurasia

1
@Chaurasia gerçekten değil, gereksinimlerinize uymayan bazı özel yapılandırmalarım var. Asıl cevap, sorunun hangi kesin çizgiye neden olduğunu veya çözdüğünü anlamak olabilir. React versiyonunuzu bile bilmiyorum, bu yüzden o kadar basit değil.
Kruupös

-2

Yukarıdaki tüm adımları denedikten sonra bile herhangi biri hala sorunla karşı karşıyaysa, o zaman işte çözüm

MainApplication.java'da bu içe aktarmayı ekleyin:

import com.facebook.react.BuildConfig;

Uyarı! Expo çıplak iş akışını kullanıyorsanız bu içe aktarmayı eklemeyin. BuildConfig.DEBUGDeğeri bozar ve hata ayıklama yapılarınızın artık çalışmamasına neden olur.
Andru

BuildConfig, projeniz için otomatik olarak oluşturulan bir dosyadır, bunu facebook'tan içe aktarmamalısınız.
Bruno Lemos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.