OHOS(HarmonyOS) 编译 C/C++ 库
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 环境准备
- 下载HarmonyOS SDK, https://ci.openharmony.cn/workbench/closerelease/sdk
- 下载 ohos-sdk-full.tar.gz 即可,里边包含 window 和 linux 的库
- mac 下载 ohos-sdk-mac-full.tar.gz 包
- 我下载的是 3.1.6版本,2023年1月30日发布(此版本编译aki会报错,找不到 unordered_map)
- 最新版本可以从 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.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_STL libc++的链接方式,由于C++运行时中存在一些全局变量,因此同一应用中的全部Native库需要采用相同的链接方式。
举例如下:
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 交叉编译框架