React Native动态模块与原生集成报couldn't find DSO to load: libjsc.so错误
React Native动态特性模块加载so错误修复方案
核心问题说明
你遇到的libjscexecutor.so找不到错误,本质是React Native默认的SoLoader仅支持读取base.apk内置的so库路径,拆分到动态特性模块的RN相关so不会被SoLoader自动识别,导致启动RN Activity时加载失败。
疑问解答:动态模块是否需要动态加载对应库?
需要。只有当RN相关依赖完全内置在base基础模块时,才不需要额外处理加载逻辑;如果RN所有代码和依赖都打包在单独的动态模块中,必须手动处理so加载路径:
- 动态模块安装完成后,系统默认不会主动加载模块内的so库
- SoLoader本身没有适配Android App Bundle动态特性的拆分路径,无法自主找到动态模块中的so文件
具体修复步骤
- 修正so预加载逻辑:删除无效的
SplitInstallHelper.loadLibrary(context, "SoLoader")调用,改成预加载RN依赖的原生so库,示例代码如下:
// 动态模块安装成功后、初始化RN之前调用 SplitInstallHelper.loadLibrary(context, "reactnativejni"); SplitInstallHelper.loadLibrary(context, "jscexecutor"); // 开启Hermes时额外添加 SplitInstallHelper.loadLibrary(context, "hermes");
系统预加载完成的so会被SoLoader优先复用,不会再触发路径查找逻辑。
- 调整依赖配置:把base模块build.gradle中所有RN、Hermes、jsc相关的依赖声明全部移动到rnmodule动态模块的build.gradle中,base模块不要保留任何RN相关依赖,避免so重复打包或者漏打包。
- 适配SoLoader搜索路径:在rnmodule中初始化SoLoader时,传入动态模块的so搜索源,示例代码:
SoLoader.init( context, 0, Collections.singletonList(new SplitSoSource(context, "rnmodule", 0)) );
- 调整打包配置:如果你的动态模块是离线分发,需要把
bundleInDebug和bundleInRelease根据场景改为true,把js bundle打包到动态模块的assets目录中,避免后续出现找不到js入口的问题。
原有方案无效原因说明
- 加载
SoLoader的操作无效:SoLoader是Java类,不是so库,该调用不会产生任何加载效果 - 切换Hermes无效果:不管使用JSC还是Hermes引擎,都需要加载对应so库,路径查找问题不解决的前提下切换引擎不会有任何改善
- 仅移动gradle配置未生效:移动配置是必要操作,但需要配合修改so加载逻辑才能解决根因问题
内容的提问来源于stack exchange,提问作者Pranjal Khandelwal
相关产品推荐
相关产品推荐

