OHOS(HarmonyOS) 编译 C/C++ 库

时间:2025-02-11 20:46:40

1. OHOS(HarmonyOS) 编译 C/C++ 库

  • 1. OHOS(HarmonyOS) 编译 C/C++ 库
    • 1.1. HarmonyOS 简介
    • 1.2. harmon sdk 环境准备
      • 1.2.1. ets
      • 1.2.2. js
      • 1.2.3. native
      • 1.2.4. previewer
      • 1.2.5. toolchains
    • 1.3. linux下编译三方C/C++库
      • 1.3.1. cmake 编译
      • 1.3.2. configure 编译
      • 1.3.3. makefile 编译
    • 1.4. aki
    • 1.5. 参考文档

1.1. HarmonyOS 简介

本文主要介绍如何在 Linux 下使用 HarmonyOS SDK, 为 OHOS(HarmonyOS 简称 OHOS) 编译 C/C++ 库

harmonyOS 使用 ArkTS 语音,ArkTS 是 TS(TypeScript)的超级,TS是 JS(JavaScript) 的超集。简单来说,ArkTS 是 JS 语法的扩展,如果你熟悉 JS,那么学习 ArkTS 会非常容易。

1.2. harmon sdk 环境准备

  1. 下载HarmonyOS SDK, https://ci.openharmony.cn/workbench/closerelease/sdk
    1. 下载 ohos-sdk-full.tar.gz 即可,里边包含 window 和 linux 的库
    2. mac 下载 ohos-sdk-mac-full.tar.gz 包
    3. 我下载的是 3.1.6版本,2023年1月30日发布(此版本编译aki会报错,找不到 unordered_map)
    4. 最新版本可以从 https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes 的镜像站点获取
  • SDK 分为两个版本 full 版本和 public 版本, 这两个版本的 SDK 中关于 c/c++ 编译的部分是相同的,full 版本的 SDK 在 ets 层提供了更多的 API
  • 解压 ohos-sdk-full.tar.gz 后,得到 ohos-sdk 目录,里面包含了 linux 和 windows 的 SDK, 解压linux中的压缩包,结果如下
➜  ohos-sdk git:(master) ✗ tree -L 2
.
├── linux
│   ├── ets
│   ├── ets-linux-3.1.12.5-Release.zip
│   ├── js
│   ├── js-linux-3.1.12.5-Release.zip
│   ├── native
│   ├── native-linux-3.1.12.5-Release.zip
│   ├── previewer
│   ├── previewer-linux-3.1.12.5-Release.zip
│   ├── toolchains
│   └── toolchains-linux-3.1.12.5-Release.zip
└── windows
    ├── ets-windows-3.1.12.5-Release.zip
    ├── js-windows-3.1.12.5-Release.zip
    ├── native-windows-3.1.12.5-Release.zip
    ├── previewer-windows-3.1.12.5-Release.zip
    └── toolchains-windows-3.1.12.5-Release.zip

7 directories, 10 files

1.2.1. ets

ets 目录主要与 eTS(HarmonyOS eXtended TypeScript)开发相关,eTS 是 OpenHarmony 推荐的开发语言。

1.2.2. js

js 目录用于支持 JavaScript 开发,尽管 OpenHarmony 更推荐使用 eTS,但仍保留对 JavaScript 的支持。

1.2.3. native

编译 C/C++ 代码需要的文件夹,主要包含 Clang 等编译工具

➜  native git:(master) ✗ tree -L 1
.
├── build                               # 目录存放的是 构建时 cmake 依赖的配置文件,比如 cmake/ohos.toolchain.cmake, cmake 编译三方库时使用
├── build-tools                         # 目录存放的是 构建工具包含 cmake 和 ninja,我们后面采用 make 进行构建。
├── docs                                # 目录存放 使用说明
├── llvm                                # 目录存放 clang 编译器, configure/makefile 等编译工具使用
├── nativeapi_syscap_config.json        # 记录 SDK 提供的能力对应的头文件
├── ndk_system_capability.json          # 记录记录 SDK 提供的能力
├── NOTICE.txt                          # 为注意事项,内容多为 SDK 的详细描述
├── oh-uni-package.json                 # 为 SDK 信息描述,如版本
└── sysroot                             # 目录为编译器的 sysroot 目录,存放 SDK 内部的已经包含的库和对应的头文件

5 directories, 4 files

1.2.4. previewer

previewer 指的是预览器,它为开发者提供了在开发环境中快速预览应用界面效果的能力,无需将应用部署到实际设备或模拟器上

1.2.5. toolchains

tools 目录包含了开发、调试和打包 OpenHarmony 应用所需的各种工具。

1.3. linux下编译三方C/C++库

  1. 准备环境,详见上文
  2. 下载要编译的三方库源码
  3. 开始编译(根据源码,有多种编译方式,详见下文)

1.3.1. cmake 编译

参考 https://gitee.com/openharmony-sig/tpc_c_cplusplus/blob/master/lycium/doc/ohos_use_sdk/OHOS_SDK-Usage.md

  • 这是官方推荐的编译方式,也是最常用最简单的方式
  • 和标准的 cmake 编译方式类似,只是需要制定一些额外的参数
    • OHOS_STL libc++的链接方式,由于C++运行时中存在一些全局变量,因此同一应用中的全部Native库需要采用相同的链接方式。
      • c++_shared (默认)
      • c++_static
    • OHOS_ARCH
      • x86_64 (默认)
      • armeabi-v7a
      • arm64-v8a
    • OHOS_PLATFORM=OHOS
    • CMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake

举例如下:

OHOS_SDK=/data/code/toolchain/harmonyOS/ohos-sdk/linux 
PATH=${OHOS_SDK}/native/build-tools/cmake/bin:$PATH
which cmake

rm -rf build
mkdir build
cmake -DOHOS_STL=c++_shared -DOHOS_ARCH=armeabi-v7a -DOHOS_PLATFORM=OHOS -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake -B build
cmake --build build

举例

git clone https://github.com/DaveGamble/cJSON.git -b v1.7.15
cd cJSON
OHOS_SDK=/data/code/toolchain/harmonyOS/ohos-sdk/linux
${OHOS_SDK}/native/build-tools/cmake/bin/cmake -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake  -B build
cmake --build build

1.3.2. configure 编译

参考 https://gitee.com/openharmony-sig/tpc_c_cplusplus/blob/master/lycium/doc/ohos_use_sdk/OHOS_SDK-Usage.md

# aarch64-linux-ohos
export OHOS_SDK=/data/code/toolchain/harmonyOS/ohos-sdk/linux # 此处是我的ohos_sdk解压目录,请替换为你自己的解压目录

export AS=${OHOS_SDK}/native/llvm/bin/llvm-as
export CC="${OHOS_SDK}/native/llvm/bin/clang --target=aarch64-linux-ohos"
export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=aarch64-linux-ohos"
export LD=${OHOS_SDK}/native/llvm/bin/ld.lld
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 -D__MUSL__=1"
export CXXFLAGS="-fPIC -D__MUSL__=1"
export HOST_TAG=aarch64-linux
# linux-arm
export OHOS_SDK=/data/code/toolchain/harmonyOS/ohos-sdk/linux # 此处是我的ohos_sdk解压目录,请替换为你自己的解压目录

export CC="${OHOS_SDK}/native/llvm/bin/clang --target=arm-linux-ohos"
export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=arm-linux-ohos"
export CFLAGS="-fPIC -march=armv7a -D__MUSL__=1"
export CXXFLAGS="-fPIC -march=armv7a -D__MUSL__=1"

export AS=${OHOS_SDK}/native/llvm/bin/llvm-as
export LD=${OHOS_SDK}/native/llvm/bin/ld.lld
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 HOST_TAG=arm-linux
# 设置好上边编译参数之后,只要按照标准的 configure 用法即可.
wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.18.tar.gz
tar xvf ${src_pkg}
cd libsodium-1.0.18
install_dir=/tmp/${HOST_TAG}
./configure --host=${HOST_TAG} --prefix=${install_dir}
make && make install
file ${install_dir}/lib/*
cd -

1.3.3. makefile 编译

具体可参考 configure 编译

1.4. aki

https://gitee.com/openharmony-sig/aki

AKI (Alpha Kernel Interacting) 是一款边界性编程体验友好的ArkTs FFI开发框架,针对OpenHarmony Native开发提供JS与C/C++跨语言访问场景解决方案。支持极简语法糖使用方式,一行代码完成JS与C/C++的无障碍跨语言互调,所键即所得。
可以实现 C/C++ 调用 JS,JS 调用 C/C++

1.5. 参考文档

  • release-sdk
  • OpenHarmony Linux 环境 SDK 使用说明
  • 知识地图
  • 5.0.0(12)- API 12 Release
  • 5.0.1(13)- API 13 Release
  • JNI与NDK有何不同
  • lycium 交叉编译框架