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.gradle
defaultConfig 部分。
【讨论】:
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
中来使用旧版本的 soloaderconfigurations.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
./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的主要内容,如果未能解决你的问题,请参考以下文章
忽略移动优先中的证书错误(React Native)(Android)