Ubuntu中用HarmonyOS Next的SDK编译libsodium,并在DevEco Studio中加载运行.a库
libsodium 是一个现代、易用、且极其安全的软件库,用于加密、解密、签名、密码哈希等安全操作。
下载地址:https://download.libsodium.org/libsodium/releases/LATEST.tar.gz
华为开发者联盟下载Command Line Tools 5.1.1 Release(包含了sdk):https://developer.huawei.com/consumer/cn/download/
设置编译工具链
这两个环境变量主要用于 交叉编译(cross-compiling),也就是在一个平台上编译目标平台的代码。具体作用如下:
-
CC
export CC="/root/harmony/command-line-tools/sdk/default/openharmony/native/llvm/bin/clang --target=aarch64-linux-ohos"
-
指定使用哪个 C 编译器(这里是 OpenHarmony SDK 自带的
clang) -
编译过程会用这个编译器来生成目标平台的可执行文件或库,而不是默认系统的
gcc或clang
-
SYSROOT
-
指定交叉编译器的 系统根路径(sysroot)
-
sysroot 中包含目标平台的标准库、头文件和工具链需要的文件
-
编译器会从这个路径寻找
include、lib等资源,而不是系统默认路径 -
保证编译出的库或可执行文件可以在目标平台(OpenHarmony)上运行
export CFLAGS="--sysroot=$SYSROOT -O2"
这个环境变量是交叉编译中的关键配置,它们告诉编译器和链接器如何找到目标平台的资源。让我详细解释:
这设置了 C 编译器的标志:
-
--sysroot=$SYSROOT:-
这是最重要的部分,它告诉编译器:"不要使用本机系统的头文件和库,而是使用
$SYSROOT目录下的头文件和库" -
对于交叉编译,这意味着:"使用 HarmonyOS 的头文件,而不是 Ubuntu 的头文件"
-
编译器会在
$SYSROOT/usr/include等目录中查找头文件
-
-
-O2:-
这是优化级别标志,表示启用中级优化
-
这会提高代码性能,但可能会增加编译时间
-
export LDFLAGS="--sysroot=$SYSROOT"
这设置了 链接器的标志:
-
--sysroot=$SYSROOT:-
告诉链接器:"在
$SYSROOT目录中查找库文件,而不是在本地系统中查找" -
链接器会在
$SYSROOT/usr/lib等目录中查找.so或.a库文件 -
这对于找到目标平台(HarmonyOS)的正确库至关重要
-
make clean mkdir -p build ./configure --host=aarch64-linux-ohos --build=x86_64-linux-gnu --prefix=$PWD/build CC="$CC" CFLAGS="--sysroot=$SYSROOT -O2" LDFLAGS="--sysroot=$SYSROOT" --enable-static --disable-shared make -j$(nproc) make install
最后在 libsodium/build 目录下生成了静态库文件 (libsodium.a) 和对应的头文件。为了验证该静态库能否在 aarch64-linux-ohos 目标平台正常运行,可将其导入 DevEco Studio 工程中,通过调用其中的加密 API(如加密、解密、哈希等)进行功能与兼容性测试,确保编译产物在实际鸿蒙系统环境中的可用性。
DevEco Studio中加载运行.a库。
将build 文件夹下的lib 和include 复制到 DevEco Studio 新建项目的..\entry\libs\arm64-v8a 目录下。然后在src/main/cpp/CMakeLists.txt 中添加
# the minimum version of CMake.
cmake_minimum_required(VERSION 3.5.0)
project(YunShiYuanCheng)
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
set(LIBSODIUM_ROOT ../../../libs/arm64-v8a/libsodium)
# 添加头文件路径
include_directories(${LIBSODIUM_ROOT}/include)
# 添加库文件路径
link_directories(${LIBSODIUM_ROOT}/lib)
include_directories(${NATIVERENDER_ROOT_PATH}
${NATIVERENDER_ROOT_PATH}/include
)
add_library(entry SHARED napi_init.cpp)
target_link_libraries(entry PUBLIC sodium libace_napi.z.so)
2️⃣ 确认库文件和架构
-
文件必须是
libsodium.a(静态库,名称不能变) -
架构必须和 target 一致:
aarch64-unknown-linux-ohos -
Windows 上可以用
llvm-objdump或readelf检查.a架构:

浙公网安备 33010602011771号