在上一期文章中,笔者研究了OpenHarmony原生集成nodejs方案,详细见https://mp.weixin.qq.com/s/Eko6OQmhyAhwii-wG4b3ww
发现该方案在npm包兼容情况方面不佳,如openclaw-cn安装过程中遇到其依赖库依赖gnu库的情况,导致安装失败。
笔者在本文章中,研究了在OpenHarmony上兼容gnu库集成linux node.js二进制的方案,笔者将linux中的 GNU C 库(glibc)和GNU C++ 库(libstdc++)集成到OpenHarmony中,成功解决了openclaw-cn包的安装问题。
OpenHarmony中c库使用的是musl,使用llvm开源项目的C ++ 标准库libc ++ 作为C ++ 运行时库
开源地址:https://gitee.com/OpenHarmony_rk_equipment_transplantation/nodejs_OpenHarmony/tree/6.0r_gnu/
集成步骤
javascript
repo init -u https://gitee.com/openharmony/manifest -b OpenHarmony-6.0.0-Release --no-repo-verify
repo sync -c && repo forall -c 'git lfs pull'
# 安装依赖
./build/build_scripts/env_setup.sh
source ~/.bashrc
# 下载编译工具
bash build/prebuilts_download.sh
git clone -b 6.0r_gnu https://gitee.com/OpenHarmony_rk_equipment_transplantation/nodejs_OpenHarmony.git nodejs_oh
# 获取node.js linux二进制
wget -P nodejs_oh https://nodejs.org/dist/v22.19.0/node-v22.19.0-linux-arm64.tar.xz
tar -xJf nodejs_oh/node-v22.19.0-linux-arm64.tar.xz -C nodejs_oh/
# 下载arm交叉编译工具链获取 GNU 库
wget -P nodejs_oh https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu/14.2.rel1/binrel/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
tar -xJf nodejs_oh/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C nodejs_oh/
# 应用补丁
bash nodejs_oh/patch.sh
# 拷贝新的rk3568烧录配置文件,因为将system分区扩大到了原来的两倍
mv device/board/hihope/rk3568/loader/config.cfg device/board/hihope/rk3568/loader/config_back.cfg
cp nodejs_oh/config.cfg device/board/hihope/rk3568/loader/
rm -rf out && ./build.sh --product-name rk3568 --ccache

npm包支持情况
openclaw-cn包安装正常


win上hdc乱码问题解决,使用cmd执行chcp 65001 然后hdc shell
OpenHarmony上兼容gnu库原理
主要就是获取arm交叉编译工具链中的GNU 库,然后在OpenHarmony中集成这些库,就可以在OpenHarmony上运行linux的二进制了。

注意有些库在同目录下创建符号链接

总结
兼容gnu库后,绝大部分linux的二进制都可以正常在OpenHarmony上使用,就是oh子系统上无法调用linux二进制。
OpenHarmony上兼容gnu库,可以满足部分不涉及oh子系统层开发的需求。