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),也就是在一个平台上编译目标平台的代码。具体作用如下:

  1. CC 

export CC="/root/harmony/command-line-tools/sdk/default/openharmony/native/llvm/bin/clang --target=aarch64-linux-ohos" 

  

  • 指定使用哪个 C 编译器(这里是 OpenHarmony SDK 自带的 clang

  • 编译过程会用这个编译器来生成目标平台的可执行文件或库,而不是默认系统的 gccclang

  1. SYSROOT 

export SYSROOT=/root/harmony/command-line-tools/sdk/default/openharmony/native/sysroot     
  • 指定交叉编译器的 系统根路径(sysroot)

  • sysroot 中包含目标平台的标准库、头文件和工具链需要的文件

  • 编译器会从这个路径寻找 includelib 等资源,而不是系统默认路径

  • 保证编译出的库或可执行文件可以在目标平台(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-objdumpreadelf 检查 .a 架构:

 
llvm-objdump -f E:/rustdesk/libs/libsodium/lib/libsodium.a
posted @ 2025-09-06 22:49  Fitz  阅读(37)  评论(0)    收藏  举报