React-Native:java.lang.UnsatisfiedLinkError:找不到要加载的DSO:libhermes.so

时间:2019-07-15 08:56:00

标签: android 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,但不幸的是,没有一个对我有用。请提出解决方法。

21 个答案:

答案 0 :(得分:22)

我刚刚清理了android的build文件夹,然后,它运行良好。希望能帮助交配。

Authtoken

答案 1 :(得分:9)

  1. 打开node_modules / jsc-android / README.md
  2. 找到“如何在我的React Native应用程序中使用它”部分

例如:

  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
}

答案 2 :(得分:8)

如果在更新到React Native版本0.62.2时遇到此错误:

将以下内容添加到您的android/app/build.gradle文件中:

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

作为前implementation个条目之一。

Solution taken from here

答案 3 :(得分:7)

我已经通过添加

解决了此问题
 configurations.all {
    resolutionStrategy {
        force "com.facebook.soloader:soloader:0.8.2"
    }
}

答案 4 :(得分:4)

  

将此添加到您的项目级别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()
    }
}

答案 5 :(得分:3)

我什么也没做。 ./gradlew clean解决了我的问题。

答案 6 :(得分:2)

从0.59.8升级到0.60.4后,我遇到了同样的问题

请确保已在 app / build.gradle 中添加了所有这些行,尤其是 dependencies 部分,因为这可以确保您具有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) {
      def hermesPath = "../../node_modules/hermesvm/android/";
      debugImplementation files(hermesPath + "hermes-debug.aar")
      releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
      implementation jscFlavor
    }

答案 7 :(得分:2)

就我而言,我需要为每个 android 风格添加 Hermes 路径

    if (enableHermes) {
        def hermesPath = "../../node_modules/hermes-engine/android/";
        debugImplementation files(hermesPath + "hermes-debug.aar")
        releaseImplementation files(hermesPath + "hermes-release.aar")
        qaImplementation files(hermesPath + "hermes-release.aar")
        stageImplementation files(hermesPath + "hermes-release.aar")
        prodImplementation files(hermesPath + "hermes-release.aar")
    } else {
        implementation jscFlavor
    }

答案 8 :(得分:2)

在遵循所有建议但没有成功之后,我构建了一个* .apk而不是一个* .aab。 APK是16 MB,而不是8 MB AAB,但是我终于摆脱了UnsatisfiedLinkError。

要构建AAB(因UnsatisfiedLinkError而崩溃):

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

要构建APK(也不会崩溃,爱马仕也能正常工作):

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

答案 9 :(得分:0)

尝试在app / build.gradle内替换您的ndk对象

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

答案 10 :(得分:0)

就我而言,从未启用过爱马仕,但我遇到了此错误。清理(​​通过Android Studio)并重建可解决该错误。

答案 11 :(得分:0)

当我尝试在0.60之前的较早版本的React Native上运行时出现此错误,而在package.json中定义了较新的版本(0.60版)。

答案 12 :(得分:0)

就我而言,只需在enableHermes中打开app/build.gradle

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

答案 13 :(得分:0)

在我更新android studio之后,它发生在我身上,然后我再次清理并构建,它不再崩溃了。

答案 14 :(得分:0)

对于遇到此问题的其他人,有两个部分看起来相似。您需要更新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()
    }
}

答案 15 :(得分: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

答案 16 :(得分:0)

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

&

确保您已安装此 - https://www.npmjs.com/package/jsc-android

就我而言,由于某种原因它不在那里。

答案 17 :(得分:0)

我将此块添加到project_dir / build.gradle的allProject块中,崩溃消失了。

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

我所做的是使用react-native init创建一个新项目,并通过了android构建文件。幸运的是,这是我注意到并解决了我的问题的第一个区别。我想如果这样做不行,您也可以这样做。

答案 18 :(得分:0)

为了避免这种意外行为,我选择在我的所有项目中使用 fastlane(非常容易实现和使用)。每次寻找新版本时,我都会创建一个短通道来清理项目。

lane :clean do
    gradle(
      task: "clean"
    )
end

然后我在我的生产通道命令中使用这个通道

lane :release do
  check_env
  bump
  ...
  clean
  gradle(
    task: 'bundle',
    build_type: 'Release'
  ) 
end

答案 19 :(得分:-1)

以简单的方式解决此问题。

 <agm-map [latitude]="latitide" [longitude]="langtitude" [zoom]="zoom">

 </agm-map>

答案 20 :(得分:-2)

如果尝试了上述所有步骤后,仍然有任何问题,那么这里就是解决方法

在MainApplication.java中,添加以下导入:

import com.facebook.react.BuildConfig;