React-Native:java.lang.UnsatisfiedLinkError:ロードするDSOが見つかりませんでした:libhermes.so


83

プロジェクトを更新して、react-nativeバージョン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からchangelog / blog:この変更により、ReactNativeアプリはAndroidX自体の使用を開始する必要があります。これらを1つのアプリで並べて使用することはできないため、すべてのアプリコードと依存関係コードでどちらか一方を使用する必要があります。これはあなたの場合かもしれませんか?
AsifM

回答:


61

0.59.8から0.60.4にアップグレードした後も同じ問題が発生しました

app / 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
    }

編集

また、HermesMavenリポジトリがルートbuild.gradleにあることを確認してください

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

11
0.60.4にアップグレードした後、これは機能しませんでした。何度も掃除をしてみました。エルメスを無効にできないようです。「ロードするDSOが見つかりませんでした:libhermes.so」の開始時にクラッシュします
Ed of

3
src / android / build.gradleに、hermes libsのmavenリポジトリも追加されていることを確認してください(他の回答が提案しているように)。これは、JavaScriptCoreにおける&いないエルメス、具体的に関連するかもしれない
Vinzzz

ありがとうございました!"maven {url(" $ rootDir /../ node_modules / jsc-android / dist ")}がありませんでした
Ed of

ありがとう!その動作は私ですが、プロジェクトbuild.gradlemavenにこのブロックを追加することを忘れないでください{// AndroidJSCはnpmurl( "$ rootDir /../ node_modules / jsc-android / dist")からインストールされます}
Vishal Gadhiya

4
反応し、ネイティブの0.61アンドロイド/アプリ/ build.gradleでhermesvm部分はエルメス・エンジンに移動しました:github.com/facebook/react-native/blob/0.61-stable/template/...
マイク・ハーディ

23

このブロックをproject_dir / build.gradleのallProjectブロックに追加すると、クラッシュは解消されました。

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

私がしたことは、react-native initを使用して新しいプロジェクトを作成し、Androidビルドファイルを調べたことです。幸いなことに、これは私が気付いて問題を修正した最初の違いでした。これがうまくいかない場合は、同じことができると思います。


ここでは同じ@msqar
0x01Brain

2
その行を追加すると、ビルド中に次のエラーが発生しました。error: package com.facebook.react.module.annotations does not exist
0x01Brain19年

1
ここで変更を確認することは良いアイデアかもしれません react-native-community.github.io/upgrade-helper
P-RAD

21

Androidのビルドフォルダーをクリーンアップしたところ、正常に動作しました。それが仲間を助けることを願っています。

cd android
./gradlew clean 

何時間ものデバッグと検索が行われ、クリーンによって修正されました...
tibbus

ええ、それがこのばかげた修正であることが
わかっ

バンドルリリースを作成するときに常にこのエラーが発生します。毎回クリーンに実行する必要があります
tibbus

8
  1. node_modules / jsc-android /README.mdを開きます
  2. セクション「reactNativeアプリでの使用方法」を検索

例えば:

  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
}

私はpackagingOptionsを使用せずに上記の方法で実行しましたが、それで十分です。ありがとう。
oguzhan

私にとっては、私はちょうど追加するために必要な pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
dazza5000

答えを見つけるための長年の研究。解決してくれてありがとう。
R.Mohanraj

7

私はこれを追加することで解決しました

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

これを正確にどこに、どのファイルに追加しましたか?
Andru

1
app/build.gradleの内側の終わりdependencies { } dependencies { implementation project(':react-native-permissions') configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" } } }
dasl

5

React Nativeバージョンへの更新中にこのエラーが発生した場合0.62.2

以下をandroid/app/build.gradleファイルに追加します。

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

最初の1つとして 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
黒鷺京

同じエラーが発生します。これを解決できますか?
Hugo Pretorius

誰かがこれを解決できますか?@HugoPretorius
ディエゴリベラ

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
プロジェクトgradleにurl( "$ rootDir /../ node_modules / jsc-android / dist")を追加しました。ありがとうEliezerSteinbock
達人

3

これをプロジェクトレベルの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

すべてのアドバイスに成功せずに従った後、私は* .aabの代わりに* .apkを作成しました。APKは8MBのAABではなく16MBですが、私はついにUnsatisfiedLinkErrorを取り除きました。

AABを構築するには(UnsatisfiedLinkErrorでクラッシュ):

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

APKを作成するには(クラッシュせず、エルメスも正常に機能します):

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

これは永続的な解決策ではありませんが、今のところ問題を修正した一時的な回避策です。ありがとう!
kentrh

2

私はそれ以上何もしませんでした。./gradlew clean私の問題を解決しました。


古い質問への回答を正式に投稿しているためです。いくつかのコードと、コードを使用した結果の出力を使用して、意図された回答をサポートすることが最も役立ちます。コードの結果をコピーできない場合は、コピーアンドペーストまたはスクリーン印刷で回答をサポートできます。
灰色

0

私の場合、Hermesが有効になったことがないのに、このエラーが発生しました。クリーニング(Android Studio経由)と再構築でエラーが解決しました。


Android Studioと経由でのクリーニング./gradlew cleanは違いがありますか?
Andru

0

app /build.gradle内のndkオブジェクトを置き換えてみてください

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

0

package.json新しいバージョンが定義されているときに0.60より前の古いバージョンのReactNativeで実行しようとしたときに、このエラーが発生しました(0.60以降)。


0

android studioを更新した後、クリーンアップして再度ビルドすると、クラッシュしなくなりました。


-1

私の場合、でオンにするだけenableHermesですapp/build.gradle

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

あなたはエルメスをオンにした場合、あなただけの変更は、オプションを構築し、それがエルメスにSoLoaderを交換し、エルメスを経由してビルドを行います...が、それは固定されていません
ルカシュŠálek

-1

上記のすべての手順を試してみても問題が解決しない場合は、次の方法で解決できます

MainApplication.javaで、次のインポートを追加します。

import com.facebook.react.BuildConfig;

警告!Expoベアワークフローを使用している場合は、そのインポートを追加しないでください。BuildConfig.DEBUG値が台無しになり、デバッグビルドが機能しなくなります。
アンドルー

-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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.