RNOH 运行类 FAQ:启动闪退、动态库缺失与字节码问题排查
启动后闪退,提示没有设置RNOH_C_API_ARCH
- 查看闪退日志
程序编译运行,并且正常安装到手机上,但是一旦运行就闪退。在 DevEco Studio > Log > FaultLog 中查看闪退日志。 - 出错截图

- 解决
-
此报错是 CAPI 版本的错误,需要您在环境变量中设置
RNOH_C_API_ARCH=1,重启 DevEco Studio,并运行 Build > Clean Project,重新编译后即可解决。 -
如果上述设置不生效,可以请删除
.cxx目录,重新编译运行。 -
如果上述操作还不生效,可以在您自己的
CMakeLists.txt中设置:set(RNOH_C_API_ARCH, 1) -
其余闪退问题可以参考CppCrash故障定位指导进行分析。
混合方案闪退时报错insertChild
- 错误截图

- crash
当使用功能混合方案的时候遇到闪退,闪退的调用栈中存在ComponentInstance::insertChild的调用栈,需要排查创建RNInstance的时候,CustomRNComponentFrameNodeFactory是否被正确创建。需要正确创建该工厂方法,或升级 RNOH 版本来解决。
混合方案闪退时报错:Cannot read property tag of undefined
- 错误截图

- crash
当使用混合方案的时候遇到闪退,闪退的调用栈栈底显示CustomRNComponentFrameNodeFactory中时,需要排查一下是否在创建RNApp或RNInstance的时候,将组件的name放到数组中,并作为arkTsComponentNames的参数传入。
运行后报错:Coundn't create bindings between ETS and CPP. libRNOHApp is undefined.
- 现象 运行 RN 应用时,Crash,FaultLog 提示:
Error message: Coundn't create bindings between ETS and CPP. libRNOHApp is undefined。 - 原因
libRNOHApp库实际对应的库是librnoh_app.so动态库,是 C++ 编译的动态库产物,报上述错误的原因有 2 个:- 原因 1:
librnoh_app.so确实没有。 - 原因 2:有,定位其他原因。
- 原因 1:
- 解决 确定
librnoh_app.so是否有,可以去鸿蒙工程根目录\entry\build\default\intermediates\libs\default\arm64-v8a\下查找是否有对应 so;或者去鸿蒙工程根目录\entry\build\default\outputs\default\XXX.hap包中的libs/arm64-v8a中查找是否有对应so。-
原因 1 解决方案:需要编辑配置文件
entry/build-profile.json5,在 buildOptions 下补充externalNativeOptions选项:"buildOption": { "externalNativeOptions": { // native编译配置选项 "path": "./src/main/cpp/CMakeLists.txt", // native层对应的CMakeLists.txt "arguments": "", "cppFlags": "", } } -
原因 2 解决方案:
(1)需要查看 Hilog 日志确定具体问题,一个可能的原因是
libhermes.so没有打包到 XXX.hap 包中引起的(Hilog 日志报:can't find library libhermes.so in namespace: moduleNs_default)。(2)或者打开 IDE 的错误增强功能,参考下图:
(3)因为 IDE 升级,需要开发者修改适配,修改适配可参考文档,简单说就是:2 个 har 包,har 包 A 的 so 依赖了 har 包 B 的 so,以前,har 包 A 会打包 Har 包 B 的 so 到的 har 包 A 里,修改适配之后,则不会。
(4)解决:自动解决(需要升级 IDE 到最新版本)
har 模块
/build-profile.json5中增加://(modules.json5中type=har) "nativeLib": { // 与externalNativeOptions字段同级别 "excludeFromHar": false }参数说明详见文档。
手动解决:需要将 RN 源码目录
oh_modules/@rnoh/react-native-openharmony/src/main/cpp/third-party/prebuilt下的内容整体拷贝到oh_modules/@rnoh/react-native-openharmony/libs目录下。
-
运行后报错:cannot find record '&@rnoh/react-native-openharmony/generated/ts&0.77.23',please check the request path.'/data/storage/el1/bundle/entry/ets/modules.abc'.
- 现象 运行 RN 应用时,jscrash,提示:
cannot find record '&@rnoh/react-native-openharmony/generated/ts&0.77.23',please check the request path.'/data/storage/el1/bundle/entry/ets/modules.abc'.。 - 原因 遇到这个 jscrash 这个错说明您使用的是字节码格式的release包,具体原因如下:
- 开发者执行Codegen时将ArkTS组件或Turbomodule的类型声明文件生成到 oh_modules/@rnoh/react-native-openharmony/generated 目录下;
- 在使用时也能支持导入到该目录;
- 但ohmurl的标准import路径没有指向文件,导致运行时找不到该record。
- 解决 react-native-openharmony-cli 0.77.23 及之后的版本中 codegen-harmony 命令提供了
--ets-output-path参数,通过该参数将 Codegen 生成的 ets 文件生成在源码目录下,而不是在 oh_modules 目录下,然后重新调整相关文件的导入路径。如:- "codegen": "react-native codegen-harmony --cpp-output-path ../NativeProject/entry/src/main/cpp/generated --rnoh-module-path ../NativeProject/entry/oh_modules/@rnoh/react-native-openharmony --no-safety-check" + "codegen": "react-native codegen-harmony --cpp-output-path ../NativeProject/entry/src/main/cpp/generated --ets-output-path ../NativeProject/entry/src/main/ets --no-safety-check"- import { RNC } from "@rnoh/react-native-openharmony/generated/ts" + import { RNC } from "./generated/ts"
更多推荐



所有评论(0)