Android ReactNative 报错:java.lang.UnsatisfiedLinkError: 找不到要加载的 DSO: libreactnativejni.so。

41

我一直在尝试将ReactNative添加到我的现有Android应用程序中。我按照这个链接的说明进行操作。我成功地添加了它,但是一旦我打开React Native活动,应用程序就会崩溃。我已经使用以下命令启动了服务器:

adb reverse tcp:8081 tcp:8081

我使用以下命令启动了React Native:

react-native start

我得到了一个对话框,显示js文件正在加载。但最终崩溃了。以下是在logcat中打印的错误:

java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libreactnativejni.so
    at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:213)
    at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:178)
    at com.facebook.react.bridge.JSCJavaScriptExecutor.<clinit>(JSCJavaScriptExecutor.java:19)
    at com.facebook.react.ReactInstanceManager.onJSBundleLoadedFromServer(ReactInstanceManager.java:413)
    at com.facebook.react.ReactInstanceManager.createReactContextInBackground(ReactInstanceManager.java:236)

我完全迷失了,因为我无法找出这个问题的原因。

提前感谢。


但是你的项目中确实有.so文件吗?理论上它已经正确链接了吗? - Grisgram
不,我没有添加任何东西。 - Anudeep
我有同样的问题。自从@Anu之后,堆栈跟踪发生了一些变化,但错误仍然存在。在堆栈跟踪中更深入地查找,我发现它来自于:at com.example.MainActivity.onCreate(MainActivity.java:44),这非常奇怪,因为第44行是文件的结尾,而不是onCreate方法。使用RN 0.46.4。 - Arnold Schrijver
看到这么多人在本地遇到这个问题真是有趣。我只能通过Crashlytics在生产环境中获取到这个问题。 - Hung Vu
11个回答

38

实际上,在我的情况下这些步骤起作用:

  1. 从设备中卸载应用程序
  2. 关闭 Metro Bundler
  3. 在 android 目录上运行 ./gradlew clean
  4. 运行 react-native run-android

希望能帮到你。


22

这解决了我的问题:

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

这应该被放置在build.gradle的defaultConfig部分中。


1
谢谢,老兄!你救了我一命!!但是我还有一个问题。添加这段代码会有什么副作用吗?我的意思是,如果解决方案这么简单,为什么React-Native团队没有将其放入他们的代码中呢? - Amir Hedieh
@Amas 我不知道这是不是也发生在你的情况上,但我的问题是因为有人删除了代码中的这一部分。 :) - BlaShadow
这是由React团队移除的;react-native upgrade命令会覆盖旧版本,而不包含ndk。 - Alex Shtromberg
1
可以确认,自React Native 0.65版本以来,这不再起作用。 - Hung Vu

15

这是由以下问题引起的(已经存在2年了)https://github.com/facebook/react-native/issues/2814

来自该问题的描述:

React Native在Android上没有提供libreactnativejni.so本地库的64位版本,这可能会在64位设备上导致兼容性问题。我在尝试将React Native与我正在开发的大型现有应用程序集成时遇到了这个问题。

Facebook的回复:

"谢谢您的报告! 是的,我们不提供本地代码的64位版本,系统应该始终回退到32位。"

以及:

"大多数Android项目使用许多第三方库,包括任何包含本地64位代码的库都会导致React Native失败。"

以下SO答案Use 32-bit jni libraries on 64-bit android解释了回退到32位库的方式,以及不能混合使用的事实。所以如果找到64位,所有内容应该都是64位的。

我建议阅读Github问题#2814,有多种解决方法建议,但取决于您的情况。

发行人还写了一篇关于此的博客:Mixing 32- and 64-bit Dependencies in Android

希望能帮到您!


1
PS @Anu 我看到你也在 GitHub 上发布了问题。抱歉,我认为这是目前的状态,但有些(缓慢)的工作正在进行中。但最终 RN 将不得不支持64位,我认为很快就会实现。 - Arnold Schrijver
1
现在使用react-native 60.5应该正常工作了吗?尽管React Native在59.1中添加了对64位的支持,但我仍然在60.5中遇到相同的错误。 - Vivek Maskara
2
这怎么是一个解决方案? - Andrew Koster

5

对我而言有效的方法是清除项目构建并重新构建。 enter image description here


4

解决方案 1:

按照以下步骤操作:

  1. 从设备中卸载该应用
  2. 关闭 Metro Bundler
  3. 在 android 目录下运行 ./gradlew clean
  4. 运行 react-native run-android

希望能对您有所帮助。

解决方案 2:

您可以通过将 configurations.all 添加到您的 build.gradle 文件中来使用旧版本的 soloader。

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

像这样

// Top-level build file where you can add configuration options common to all sub-projects/modules.

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
}

reference https://dev59.com/_Lroa4cB1Zd3GeqPprZ0#61695629


2
我解决了这个问题,更新Fresco库,支持应用程序包的版本必须是2.0.0或更高。

更新:对我而言,将Fresco更新到2.0.0后问题得到解决,因为1.11.0显然不支持Android App Bundles。不过我不知道你们是否遇到了同样的问题。

只需执行以下操作:

implementation 'com.facebook.fresco:fresco:2.0.0'

1

这对我有用,

cd android
./gradlew clean

1

当我在Android 30上运行时,遇到了同样的问题。对android/build.gradle文件进行以下修改适用于我:

configurations.all {
        resolutionStrategy {
           // use 0.9.0 to fix crash on Android 11
            force "com.facebook.soloader:soloader:0.9.0"
  }
}

Credits

的英译中文为:

{{链接1:制作人员名单}}


0

步骤1:进入Android Studio -> Build -> 清理项目。 步骤2:在您的设备中删除该项目。 步骤3:运行react-native start。 步骤4:运行npx react-native run-android。

  • 对我来说它有效,不需要任何与gradle相关的更改。

0

可能是由于缺少ABI 'X86_64'的剥离工具,导致找不到lib\x86_64\libreactnativejni.so文件。请尝试以下步骤。

  1. 卸载apk
  2. 清理android文件夹

    • 进入android文件夹 cd android

    • 使用gradle清理目录

    • 对于Windows,gradlew clean

    • 对于Linux,./graldew clean
  3. 现在您可以尝试react-native run-android --no-jetifier


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接