本文以cJSON三方库为例介绍如何通过OpenHarmony的SDK在Mac平台进行交叉编译。
环境准备
SDK准备
我们可以通过 openHarmony SDK 官方发布渠道下载对应mac版本的SDK,当前OpenHarmony MAC版本的SDK有2种,一种是x86架构,另一种是arm64,我们需要根据自身设备的架构信息选择对应的版本,本示例中使用的MAC设备是m系列芯片,其架构是arm64的,因此我们选择arm64架构的SDK。
cd ~                        # 进入到用户目录
curl -L http://download.ci.openharmony.cn/version/Master_Version/OpenHarmony_4.0.10.5/20230824113825/20230824113825-L2-SDK-MAC-M1-FULL.tar.gz --output ohos-sdk.tar.gz # 通过curl命令下载工具链
下载完SDK后对其进行解压
tar -zxvf ohos-sdk.tar.gz                           # 解压ohos sdk
cd sdk/packages/ohos-sdk/darwin/                    # 进入到darwin目录
unzip native-darwin-arm64-4.0.10.5-Release.zip      # 因为 c/c++ 库的编译只涉及到 native 工具,因此我们只需要解压native工具即可。
cmake工具准备
cJSON是通过cmake构建方式进行编译的,所以在编译前我们需要确保编译机上cmake能正常使用。
原则上我们需要使用SDK提供的cmake进行编译,但当前SDK中的cmake是X86架构,在arm架构的编译机上无法使用,因此我们需要在编译机上安装系统的cmake命令:
brew install cmake          # 通过brew包管理工具安装cmake工具
由于cmake官方是不支持OHOS的,在编译过程中因为无法识别OHOS而导致编译错误,因此我们需要在系统cmake中添加OHOS的配置,方法如下:
cp sdk/packages/ohos-sdk/darwin/native/build-tools/cmake/share/cmake-3.16/Modules/Platform/OHOS.cmake /opt/homebrew/Cellar/cmake/3.28.0/share/cmake/Modules/Platform/
cJSON源码准备
适配三方库如果没有指定版本,我们一般取三方库最新版本,不建议使用master的代码,这里我们下载cJSON v1.7.15 版本的源码:
cd ~/Workspace
git clone https://github.com/DaveGamble/cJSON.git -b v1.7.15       # 通过git下载指定版本的源码
编译&安装
-  新建编译目录 为了不污染源码目录文件,我们推荐在三方库源码目录新建一个编译目录,用于生成需要编译的配置文件,本用例中我们在cJSON目录下新建一个build目录: 
   cd sJSON                             # 进入cJSON目录mkdir build && cd build              # 创建编译目录并进入到编译目录
- 配置交叉编译参数,生成Makefile
   cmake -DCMAKE_TOOLCHAIN_FILE=/Users/ohos/sdk/packages/ohos-sdk/darwin/native/build/cmake/ohos.toolchain.cmake -DCMAKE_INSTALL_PREFIX=/Users/ohos/Workspace/usr/cJSON -DOHOS_ARCH=arm64-v8a .. -L             # 执行cmake命令
参数说明:
- CMAKE_TOOLCHAIN_FILE: 交叉编译置文件路径,必须设置成工具链中的配置文件。
- CMAKE_INSTALL_PREFIX: 配置安装三方库路径。
- OHOS_ARCH: 配置交叉编译的CPU架构,一般为arm64-v8a(编译64位的三方库)、armeabi-v7a(编译32位的三方库),本示例中我们设置编译64位的cJSON库。
- -L: 显示cmake中可配置项目
-  执行编译 cmake执行成功后,在build目录下生成了Makefile,我们就可以直接执行make对cJSON进行编译了: 
   make                  # 执行make命令进行编译Scanning dependencies of target cjson[  2%] Building C object CMakeFiles/cjson.dir/cJSON.c.oclang: warning: argument unused during compilation: '--gcc-toolchain=/Users/ohos/sdk/packages/ohos-sdk/darwin/native/llvm' [-Wunused-command-line-argument]/home/owner/workspace/cJSON/cJSON.c:561:9: warning: 'long long' is an extension when C99 mode is not enabled [-Wlong-long]...删除大量 make 日志...clang: warning: argument unused during compilation: '--gcc-toolchain=/Users/ohos/sdk/packages/ohos-sdk/darwin/native/llvm' [-Wunused-command-line-argument][ 97%] Building C object fuzzing/CMakeFiles/fuzz_main.dir/cjson_read_fuzzer.c.oclang: warning: argument unused during compilation: '--gcc-toolchain=/Users/ohos/sdk/packages/ohos-sdk/darwin/native/llvm' [-Wunused-command-line-argument][100%] Linking C executable fuzz_main[100%] Built target fuzz_main
-  查看编译后文件属性 编译成功后我们可以通过file命令查看文件的属性,以此判断交叉编译是否成功,如下信息显示libcjson.so为aarch64架构文件,即交叉编译成功: 
   file libcjson.so.1.7.15     # 查看文件属性命令libcjson.so.1.7.15: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=c0aaff0b401feef924f074a6cb7d19b5958f74f5, with debug_info, not stripped
-  执行安装命令 编译成功后,我们可以执行make install将编译好的二进制文件以及头文件安装到cmake配置的安装路径下: 
   make install                # 执行安装命令[  4%] Built target cjson[  8%] Built target cJSON_test...删除大量make install信息...-- Installing: /Users/ohos/Workspace/usr/cJSON/lib/cmake/cJSON/cJSONConfig.cmake-- Installing: /Users/ohos/Workspace/usr/cJSON/lib/cmake/cJSON/cJSONConfigVersion.cmakels /Users/ohos/Workspace/usr/cJSON                  # 查看安装文件include  libls /Users/ohos/Workspace/usr/cJSON/lib/cmake  libcjson.so  libcjson.so.1  libcjson.so.1.7.15  pkgconfig
测试
交叉编译完后,需要对三方库进行测试验证。为了保证三方库功能的完整性,我们基于原生库的测试用例进行测试验证。为此,我们集成了一套可以在OH环境上进行make、cmake、 ctest等操作的工具,具体请阅读 OH测试环境配置文档。cJSON使用的是ctest方式进行测试的,具体步骤如下:
-  测试环境配置 请参考 OH测试环境配置 。 
-  准备测试资源 使用原生库的测试用例进行测试,为了保证测试时不进行编译操作,需要把整个编译的源码作为测试资源包推送到开发板,且需要保证三方库在开发板的路径与编译时路径一致: 
   tar -zcvf cJSON.tar.gz cJSON/
打包完资源后需要将资源通过hdc工具将资源包推送到开发板:
   cd /Users/ohos/sdk/packages/ohos-sdk/darwinunzip toolchains-darwin-arm64-4.0.10.5-Release.zip                       # 解压toolchain,hdc工具在toolchain包中export PATH=/Users/ohos/sdk/packages/ohos-sdk/darwin/toolchains:$PATH    # 将hdc命令加载到环境变量中cd ~/Workspace                                                           # 进入到资源所在目录hdc file send cJSON.tar.gz /data/                                        # 推送资源到开发板,保证设备已链接到编译机hdc shell                                                                # 进入开发板系统# mkdir -p /Users/ohos                                                   # 设置与编译时同样的路径# cd /Users/ohos# ln -s Workspace /data/                                                 # 系统根目录空间有限,建议通过软链接配置路径# cd Workspace# tar -zxf cJSON.tar.gz                                                  # 解压测试资源
-  执行测试 进入到cJSON的编译目录build,执行ctest测试命令进行测试: 
   # cd /Users/ohos/Workspace/cJSON/build# ctest                                                                    # 执行ctest测试命令,以下为测试信息Test project /Users/ohos/Workspace/cJSON/buildStart  1: cJSON_test1/19 Test  #1: cJSON_test .......................   Passed    0.02 secStart  2: parse_examples2/19 Test  #2: parse_examples ...................   Passed    0.02 secStart  3: parse_number3/19 Test  #3: parse_number .....................   Passed    0.02 secStart  4: parse_hex44/19 Test  #4: parse_hex4 .......................   Passed    0.10 secStart  5: parse_string5/19 Test  #5: parse_string .....................   Passed    0.01 secStart  6: parse_array6/19 Test  #6: parse_array ......................   Passed    0.01 secStart  7: parse_object7/19 Test  #7: parse_object .....................   Passed    0.01 secStart  8: parse_value8/19 Test  #8: parse_value ......................   Passed    0.01 secStart  9: print_string9/19 Test  #9: print_string .....................   Passed    0.01 secStart 10: print_number10/19 Test #10: print_number .....................   Passed    0.01 secStart 11: print_array11/19 Test #11: print_array ......................   Passed    0.01 secStart 12: print_object12/19 Test #12: print_object .....................   Passed    0.01 secStart 13: print_value13/19 Test #13: print_value ......................   Passed    0.01 secStart 14: misc_tests14/19 Test #14: misc_tests .......................   Passed    0.01 secStart 15: parse_with_opts15/19 Test #15: parse_with_opts ..................   Passed    0.01 secStart 16: compare_tests16/19 Test #16: compare_tests ....................   Passed    0.01 secStart 17: cjson_add17/19 Test #17: cjson_add ........................   Passed    0.01 secStart 18: readme_examples18/19 Test #18: readme_examples ..................   Passed    0.01 secStart 19: minify_tests19/19 Test #19: minify_tests .....................   Passed    0.01 sec100% tests passed, 0 tests failed out of 19Total Test time (real) =   0.37 sec
由以上测试结果可以看出,所有测试用例通过!
为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05
《鸿蒙开发学习手册》:
如何快速入门:https://qr21.cn/FV7h05
 
- 基本概念
- 构建第一个ArkTS应用
- ……

开发基础知识:https://qr21.cn/FV7h05
 
- 应用基础知识
- 配置文件
- 应用数据管理
- 应用安全管理
- 应用隐私保护
- 三方应用调用管控机制
- 资源分类与访问
- 学习ArkTS语言
- ……

基于ArkTS 开发:https://qr21.cn/FV7h05
 
- Ability开发
- UI开发
- 公共事件与通知
- 窗口管理
- 媒体
- 安全
- 网络与链接
- 电话服务
- 数据管理
- 后台任务(Background Task)管理
- 设备管理
- 设备使用信息统计
- DFX
- 国际化开发
- 折叠屏系列
- ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH
 

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH
 
1.项目开发必备面试题
 2.性能优化方向
 3.架构方向
 4.鸿蒙开发系统底层方向
 5.鸿蒙音视频开发方向
 6.鸿蒙车载开发方向
 7.鸿蒙南向开发方向
