笔者今年移植了Node.js到OpenHarmony标准系统上,现将成果开源到社区。

开源地址:

编译环境

本文档基于 OpenHarmony SDK 4.0.10.1

需要注意的问题,此OpenHarmony SDK版本编译的二进制文件,需要此版本SDK提供的libc++_shared.so,否则会出现如下报错
Error relocating /data/node-v16.20-ohos-install/bin/node: __emutls_get_address: symbol not found

1.下载 nodejs

wget https://codeload.github.com/nodejs/node/tar.gz/refs/tags/v16.20.2
mv v16.20.2  v16.20.2.tar.gz
tar xvf v16.20.2.tar.gz
cd node-16.20.2

2.按照下面修改源码,解决编译报错问题

1.先打ohos_1.patch补丁,解决编译报错execvp: printf: Argument list too long

2.最后打ohos_2.patch补丁。

# 将ohos_2.patch放进node-16.20.2文件夹
cd node-16.20.2
patch -p1 </your_path/node-16.20.2/ohos_2.patch

3.配置交叉编译环境,并编译 nodejs arm32 版本

export HOST_OS="linux"
export HOST_ARCH="ia32"
export CXX_host="g++ -m32"
export CC_host="gcc -m32"
export AR_host="ar"
export RANLIB_host="ranlib"
export LINK_host="${CXX_host}" 

export OHOS_SDK=/home/jiajiahao/OpenHarmony/oh_third_party/ndk/ohos-sdk/linux
export AS=${OHOS_SDK}/native/llvm/bin/llvm-as
export CC="${OHOS_SDK}/native/llvm/bin/clang --target=arm-linux-ohos -march=armv7a"
export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=arm-linux-ohos -march=armv7a"
export LD="${OHOS_SDK}/native/llvm/bin/lld --target=arm-linux-ohos -march=armv7a"
export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip
export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib
export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump
export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy
export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm
export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar
export CFLAGS="-fPIC -march=armv7a -D__MUSL__=1 -Wno-c99-extensions -Wno-strict-prototypes -Wno-deprecated-non-prototype -Wno-unqualified-std-cast-call -Wno-long-long"
export CXXFLAGS="-fPIC -march=armv7a -D__MUSL__=1 -Wno-c99-extensions -Wno-strict-prototypes -Wno-deprecated-non-prototype -Wno-unqualified-std-cast-call -Wno-long-long"
export GYP_DEFINES="target_arch=arm host_arch=ia32 host_os=linux"

4.安装必要的库

sudo apt-get install gcc-multilib g++-multilib

5.编译得到二进制包

./configure --dest-cpu="arm" --dest-os=linux --openssl-no-asm --without-intl --cross-compiling --prefix=/home/jiajiahao/OpenHarmony/oh_third_party/node.js_port_oh/node.js_port_oh_16.20/node-v16.20-ohos-install

make -j 20 > ohos.log 

make install

tar czvf node-v16.20-ohos-install.tar.gz node-v16.20-ohos-install

6.nodejs 部署到开发板


# 推送OpenHarmony NDK里/llvm/lib/arm-linux-ohos/c++/libc++_shared.so到开发板
hdc file send libc++_shared.so /data

# 推送node-v16.20-ohos-install.tar.gz到开发板
hdc file send node-v16.20-ohos-install.tar.gz /data

# 需要将系统改为可读写,因为部署nodejs需要文件操作
mount -o remount,rw /

cd data
tar xvf node-v16.20-ohos-install.tar.gz 
cd ..

// 拷贝安装动态库到开发板lib目录
cp /data/libc++_shared.so /lib


# nodejs中默认的env路径是/usr/bin/env,默认的sh路径是/bin/sh,OpenHarmony中这两者的路径是/bin/env和/bin/sh

# 手动创建/usr/bin目录
mount -o remount,rw /
mkdir /usr

# 这会创建一个符号链接,将/usr/bin链接到/bin目录。这意味着当你在/usr/bin下执行某个程序时,实际上是在bin目录中查找并执行该程序,因为/usr/bin实际上是/bin的别名。
ln -s /bin /usr/bin


# share 文件夹通常包含与 Node.js 相关的共享数据、文档、示例等内容。
cp /data/node-v16.20-ohos-install/share /usr/ -rf


# 使得node和npm在shell全局可以使用
cp /data/node-v16.20-ohos-install/bin/* /bin/ -rf 
cp /data/node-v16.20-ohos-install/lib/* /lib/ -rf

7.nodered 部署到开发板

# 重新加载系统为可读写
mount -o remount,rw /       

# 使用npm官方源
npm config set registry https://registry.npmjs.org/

# 下载node-red
npm install -g --unsafe-perm node-red 

nohup node-red & # 启动node-red,关闭终端不关闭node-red服务

需要的设备:OpenHarmony开发板、windows电脑

1.将开发板和电脑连接同一网络

开发板执行

# 查看开发板ip地址
ifconfig

mount -o remount,rw /

node-red

image.png

2.电脑端输入http:开发板ip地址:1880

image.png

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐