【问题标题】:Android ReactNative java.lang.UnsatisfiedLinkError:could find DSO to load: libreactnativejni.soAndroid ReactNative java.lang.UnsatisfiedLinkError:could find DSO to load: libreactnativejni.so
【发布时间】:2017-09-08 04:45:30
【问题描述】:

我一直在尝试将 ReactNative 添加到我现有的 android 应用程序中。我按照this 链接中的说明进行操作。我可以添加它,但是一旦我打开反应原生活动,应用程序就会崩溃。我已经使用

启动了服务器
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 文件吗?它(理论上)链接正确吗?
  • 没有。我没有添加任何内容。
  • 我也有同样的问题。由于@Anu,堆栈跟踪发生了一些变化,但错误是一样的。深入堆栈跟踪,我发现它来自:at com.example.MainActivity.onCreate(MainActivity.java:44),这很奇怪,因为第 44 行是文件的结尾,而不是onCreate 方法。使用 RN 0.46.4

标签: java android react-native


【解决方案1】:

实际上在我的情况下,这些步骤有效:

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

希望能帮到你。

【讨论】:

  • 这确实解决了这个问题。谢谢
【解决方案2】:

这解决了我的问题:

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

这应该放在build.gradledefaultConfig 部分。

【讨论】:

  • Tnx 人!你救了我!!但也是一个问题。添加此代码是否有任何副作用?我的意思是,如果解决方案这么简单,为什么 React-Native 团队没有把它放在他们的代码中?
  • @Amas 我不知道是你的情况,但我遇到了这个问题,因为有人删除了代码中的这一部分。 :)
  • 已被 React 团队移除; react-native upgrade 命令用一个不带ndk的覆盖旧版本。
【解决方案3】:

这是由以下问题引起的(开放2年)https://github.com/facebook/react-native/issues/2814

来自问题:

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

来自 Facebook 的反应:

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

还有:

大多数 Android 项目使用大量 3rd-party 库,任何包含本机 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

希望这会有所帮助!

【讨论】:

  • PS @Anu 我看到你也在 github 问题上发帖。抱歉,我认为这是当前状态,但有一些(缓慢)工作。但最终 RN 将不得不支持 64 位,我认为很快就会有。
  • 它现在应该与 react-native 60.5 一起正常工作吗?即使 react native 在 59.1 中添加了对 64 位的支持,我仍然会在 60.5 中遇到相同的错误。
  • 如何解决?
【解决方案4】:

对我来说,有效的是清理项目构建并再次构建它。

【讨论】:

    【解决方案5】:

    解决方案 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
    }
    

    参考 https://stackoverflow.com/a/61695629/8079868

    【讨论】:

      【解决方案6】:

      我解决了这个问题,更新支持app bundle的fresco库是2.0.0以下这个不支持了,

      更新:对我来说,将 fresco 更新到 2.0.0 后问题得到了解决,因为 1.11.0 显然不支持 Android App Bundle。不过不知道大家有没有同样的问题。

      只要这样做:

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

      【讨论】:

        【解决方案7】:

        我在 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

        【讨论】:

          【解决方案8】:

          这对我有用,

          cd android
          ./gradlew clean
          

          【讨论】:

            【解决方案9】:

            它可能是 lib\x86_64\libreactnativejni.so 由于缺少 ABI 'X86_64' 的剥离工具而未找到 请尝试以下步骤。

            1. 卸载apk
            2. 清理安卓文件夹

              • 导航到安卓文件夹cd android

              • 使用清理目录 毕业

              • 对于 Windows,gradlew clean

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

            【讨论】:

              【解决方案10】:

              第 1 步:转到 Android Studio -> 构建 -> 清理项目。 第 2 步:删除设备中的项目。 第 3 步:运行 react-native start。 第 4 步:运行 npx react-native run-android。

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

              【讨论】:

                【解决方案11】:

                如果您是 fresco libray,请确保使用最新版本并将属性设置为 false:

                shrinkResources false
                minifyEnabled false
                

                build.gradle 文件内。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-06-29
                  • 2023-03-12
                  • 1970-01-01
                  • 2012-06-24
                  • 1970-01-01
                  • 2022-12-27
                  • 1970-01-01
                  • 2020-10-29
                  相关资源
                  最近更新 更多