android 正在获取“java.lang.UnsatisfiedLinkError:找不到要加载DSO:libhermes.so“的错误

shstlldc  于 2022-11-20  发布在  Android
关注(0)|答案(6)|浏览(442)

我正在将React Native项目从react-native版本0.58.5迁移到0.60.4。
对于Android部分,我已经完成了上面提到的所有更改here
我让爱马仕在我的应用程序中禁用build.gradle文件:

project.ext.react = [
    entryFile: "index.js",
    enableHermes: false,  // clean and rebuild if changing
]
...
def jscFlavor = 'org.webkit:android-jsc:+'
def enableHermes = project.ext.react.get("enableHermes", false);
...
dependencies {
    ...

    if (enableHermes) {
      println 'Hermes is enabled'
      def hermesPath = "../../node_modules/hermesvm/android/";
      debugImplementation files(hermesPath + "hermes-debug.aar")
      releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
      println 'Hermes is disabled'
      implementation jscFlavor
    }
}
...

我可以在构建时看到Hermes is disabled的打印。而这正是我想要的。
使用react-native run-android启动Android应用程序时,我在启动时遇到以下崩溃:

FATAL EXCEPTION: create_react_context
E  Process: com.reactnativetestapp, PID: 21038
E  java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so
E      at com.facebook.soloader.SoLoader.doLoadLibraryBySoName(SoLoader.java:738)
E      at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:591)
E      at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:529)
E      at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:484)
E      at com.facebook.hermes.reactexecutor.HermesExecutor.<clinit>(HermesExecutor.java:20)
E      at com.facebook.hermes.reactexecutor.HermesExecutorFactory.create(HermesExecutorFactory.java:27)
E      at com.facebook.react.ReactInstanceManager$5.run(ReactInstanceManager.java:949)
E      at java.lang.Thread.run(Thread.java:764)

经过一些研究,我可以看到这个崩溃发生的人想要启用爱马仕,并有一个错误的gradle配置:[0.60.3] App crash on startup when enabling Hermes (enableHermes: true)
为什么爱马仕被禁用时我会遇到这种崩溃?
请注意,将enableHermes设置为true时,不会发生崩溃。

06odsfpq

06odsfpq1#

在完成本文中的这些步骤后,我通过一个微小的改变解决了这个问题
https://github.com/facebook/react-native/issues/25415
然后确保将此jsc-android块添加到您的android/build.gradle:

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

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

        google()
        jcenter()
    }
}
mnemlml8

mnemlml82#

您可以通过将configurations.all添加到您的build.gradle中来使用旧版本的com.facebook.soloader:soloader

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

就像这幢楼Gradle

buildscript {
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

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

allprojects {
    repositories {
        google()
        jcenter()

    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

如果以上步骤无效,请执行以下步骤
应用程序/构建版本.gradle.

android {
  ...
  // add the following packagingOptions 
  packagingOptions {
    pickFirst 'lib/x86_64/libjsc.so'
    pickFirst 'lib/arm64-v8a/libjsc.so'
  }
}

我们还将以下内容添加到app/build.gradle中的defaultConfig

ndk {
  abiFilters 'armeabi-v7a', 'x86'
}
oug3syen

oug3syen3#

请再次检查此处的所有更新-https://react-native-community.github.io/upgrade-helper/?from=0.59.9&to=0.60.5
我有同样的错误,因为在android/app/build.gradle文件的迁移中犯了一个错误。

kadbb459

kadbb4594#

我通过以下步骤解决了这个问题
1.安装hermesvm:npm和Hermesvm公司
1.安装jsc-android:npm i jsc-安卓系统
3.将此行添加到app/build.gradle

project.ext.react = [
   entryFile: "index.js" ,
   enableHermes: false
]

def jscFlavor = 'org.webkit:android-jsc:+'
def enableHermes = project.ext.react.get("enableHermes", false);

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

1.将此jsc-android块添加到您android/build.gradle中:

allprojects {
       repositories {
         maven {
           url("$rootDir/../node_modules/react-native/android")
         }
         maven {
            url "$rootDir/../node_modules/react-native/android"
         }
         google()
         jcenter()
       }
     }
x8goxv8g

x8goxv8g5#

android11用户通常会遇到这些错误
在您的项目级build.gradle中,添加以下代码片段

allprojects{
    respositories{
    ...
    google()
    jcenter()
    configurations.all {
        resolutionStrategy {

            // use 0.9.0 to fix crash on Android 11
            force "com.facebook.soloader:soloader:0.9.0"
        }
    }
}
flvtvl50

flvtvl506#

我在我的Android 10用户应用程序中也遇到了同样的问题。
我改了这个

implementation "com.facebook.react:react-native:+" // From node_modules

进入

implementation ("com.facebook.react:react-native") version {
        strictly "0.63.2" // pass in your react-native version
}

我还让爱马仕

project.ext.react = [
    enableHermes: false,
]

我的packagingOptions如下所示:

packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
        exclude("META-INF/*.kotlin_module")

        pickFirst 'lib/armeabi-v7a/libfbjni.so'
        pickFirst 'lib/arm64-v8a/libc++_shared.so'
        pickFirst 'lib/arm64-v8a/libfbjni.so'
        pickFirst 'lib/x86_64/libfbjni.so'
        pickFirst 'lib/x86/libfbjni.so'
        pickFirst 'lib/x86/libc++_shared.so'
        pickFirst 'lib/x86_64/libc++_shared.so'
        pickFirst 'lib/armeabi-v7a/libc++_shared.so'
    }

相关问题