Android ReactNative java.lang.UnsatisfiedLinkError:could find DSO to load: libreactnativejni.so

Posted

技术标签:

【中文标题】Android 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 【参考方案1】:

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

    从设备上卸载应用程序 关闭Metro Bundler 在安卓目录上运行./gradlew clean 运行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:

按照以下步骤操作:

    从设备中卸载应用程序 关闭Metro Bundler 在android目录上运行./gradlew clean 运行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://***.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' 的剥离工具而未找到 请尝试以下步骤。

    卸载apk

    清理安卓文件夹

    导航到安卓文件夹cd android

    使用清理目录 毕业

    对于 Windows,gradlew clean

    对于 Linux,./graldew clean

    现在你可以试试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 文件内。

【讨论】:

以上是关于Android ReactNative java.lang.UnsatisfiedLinkError:could find DSO to load: libreactnativejni.so的主要内容,如果未能解决你的问题,请参考以下文章

windows下reactnative环境搭建

忽略移动优先中的证书错误(React Native)(Android)

在window的环境下搭建react-native的Android开发环境(转)

ReactNative混合开发-3 Android混编配置

Flutter or ReactNative ?

ReactNative 桥接原生原子组件