1 概述
由于HarmonyOS NEXT平台与其他平台的差异性关系,开源/闭源三方库都需要重新使用HarmonyOS NEXT SDK编译适配之后才能在HarmonyOSN NEXT平台上使用。三方库基本上会提供主流平台的编译脚本,但针对HarmonyOS NEXT平台编译脚本,仅少数三方库提供,大多数都需要开发人员进行调整适配。本文将介绍开源三方库如何适配HarmonyOS NEXT游戏。
2 必备基础知识
基础知识
C/C++或其他语言编程知识
编译过程中经常需要修改三方库源码,拥有C/C++语言编程知识在三方库源码编译中很重要。当然熟悉其他编程语言也同样很重要。
CMake使用知识
大多数C/C++三方库都是使用CMake脚本(CMakeList.txt)进行编译,且HarmonyOS NEXT SDK中也提供CMake构建工具,熟悉CMake的同学会更加用以上手。
Clang/LLVM编译器使用知识
同样存在大多数三方库不是使用CMake构建系统进行编译的,这部分三方库一般是用到Makefile或是shell脚本。通常这种类型的三方库一般都是使用此类脚本间接的使用Clang/LLVM编译工具。
如果你编译过Android平台上是三方库的话,对于您来说HarmonyOS NEXT上的三方库编译就简单许多了,因为这两者基本上都是类似的。
HarmonyOS NEXT SDK介绍
下载Command Line Tools For HarmonyOS NEXT工具请前往工具下载地址。
若是在Windows上使用Linux的虚拟机时,下载Linux版的sdk压缩包之后需要在Linux虚拟机中使用unzip或是tar工具解压,避免出现问题。 |
目录介绍
三方库编译主要使用到的NDK主要在Native文件夹中,仅简单介绍此部分中内容。
1. build: 防止预定义的toolchain脚本文件ohos.toolchain.cmake。
CMake编译时需要读取该文件中的默认值,比如编译器架构、C++库链接方式等,因此在编译时会通过CMAKE_TOOLCHAIN_FILE指出该文件的路径,便于CMake在编译时定位到该文件。
2. build-tools:放置NDK提供的编译工具。
CMake构建系统编译三方库过程中主要使用cmake和ninja。
3. docs:Native接口api文档。
4. llvm:放置NDK提供的编译器。
5. sysroot:HarmonyOS NEXT SDK的Native依赖及头文件。
3 C/C++库
C/C++库一般会分三种情况:
- 情况一:提供了CmakeLists.txt脚本,可以使用sdk中自带的cmake和Ninja工具进行编译。
- 情况二:非CmakeLists.txt脚本,一般用到shell脚本(autoconf,configure)和make进行编译。
- 情况三:源码集成,直接将三方库源码添加到项目中和项目源码一起编译。
3.1 CMake编译
提供两个shell脚本,实现CMake构建三方库。
1. cmake_exec.sh。
cmake_exec.sh用来配置编译参数,根据构建规则和依赖关系生成构建文件。
# cmake_exec.sh
# ===============================
# 需调整HarmonyOS SDK路径及工具链路径
# ===============================
{OHOS_SDK_PATH}/native/build-tools/cmake/bin/cmake -GNinja \
-DOHOS_STL=c++_static -DOHOS_ARCH=arm64-v8a -DOHOS_PLATFORM=OHOS \
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./ \
-DCMAKE_TOOLCHAIN_FILE="{OHOS_SDK_PATH}/native/build/cmake/ohos.toolchain.cmake" \
-B build
cmake_exec.sh编译会生成一些“中间”文件,如调整了CMakeLists.txt文件需要将build文件夹清空,重新执行该脚本,避免文件缓存。若此脚本执行出现错误,一般情况下都是编译脚本的相关问题,主要调整CMakeLists.txt文件。
在Linux系统中若是上述脚本中不指定-GNinja的话,将默认使用make作为Generator。在windows系统中建议指定Generator为Ninja。 |
选项 | 参数 | 说明 |
---|---|---|
OHOS_STL | c++_static/c++_shared | 动态或是静态连接c++库的方式,默认采用c++_shared。 |
OHOS_ARCH | armeabi-v7a/arm64-v8a/x86_64 | ABI中支持的架构。参考HarmonyOS ABI。 |
OHOS_PLATFORM | OHOS | 平台,不指定默认OHOS。 |
CMAKE_BUILD_TYPE | normal/Release | debug模式或是release模式。 |
CMAKE_TOOLCHAIN_FILE | toolchain文件路径 | 指定toolchain文件,可使用自己的toolchain文件。一般建议指定SDK中自带toolchain文件。 |
2. ninja_exec.sh。
ninja_exec.sh是根据cmake_exec.sh脚本执行得到的构建文件进行构建,生成目标文件。
# ninja_exec.sh
# ===============================
# 需调整HarmonyOS SDK路径及工具链路径
# ===============================
# 使用ninja,在cmake_exec.sh中使用-GNinja
{OHOS_SDK_PATH}/native/build-tools/cmake/bin/ninja -C build/
# 使用make,Linux环境下在cmake_exec.sh中未指定-G
make -C build/
# 或者不区分ninja和make
cd build
{OHOS_SDK_PATH}/native/build-tools/cmake/bin/cmake --build .
ninja_exec.sh需在cmake_exec.sh脚本正常的前提下运行。如此脚本中执行出现错误,一般需要涉及源码调整。使用上述两个脚本,基本上可以满足全部的CMakeList.txt编译,然后再针对编译过程中问题进行调整。
3.2 非CMake编译
使用CMakeLists.txt重写编译脚本
此过程使用于相对简单的三方库,对于依赖简单,且使用工具单一(较为复杂的库可能还需要使用到python、rust等)的情况可以使用。如三方库提供Android平台版本,可以参考Android.mk文件进行编写,内容与CMakeLists.txt文件较为相似。
- Android.mk文件转CMakeLists.txt文件转换工具:转移工具下载地址。
- CMakeLists.txt文件编写参考:从零开始编写一个cmake构建脚本、CMAKE 规范。
使用原生的构建工具
使用原生的构建工具,需要针对环境进行配置,一般建议在Linux环境下使用。
Linux环境下需要Linux版本SDK,且需要使用Linux环境下的解压工具进行解压,避免出现问题。 |
环境配置。
export OHOS_SDK=/home/ohos/tools/OH_SDK/ohos-sdk/linux
export AS=${OHOS_SDK}/native/llvm/bin/llvm-as
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 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"
完成环境配置之后,可参照三方库提供文档按照教程进行编译。编译过程中可能会涉及一些平台相关信息调整和修改。
编译示例
示例请参见Configure构建工程配置HarmonyOS编译工具链。
3.3 编译脚本(oh-compile-script)
基于Conan 2.x的一键编译HarmonyOS NEXT库脚本,请参见脚本归档地址,Conan官方文档网站请参见Conan官方文档网站
优势
- 拿来即用,已收录100+常用三方库的多个版本。
- 不需要考虑三方库依赖问题,依赖关系已处理。
- 可快速适配新版本三方库源码,保持三方库更新。
- 使用简单,一条命令可完成编译。
- 环境安装简单,安装Python和Conan即可。
- 跨平台多端可以,支持Linux和Windows平台下交叉编译。
- 方便归档,可搭建Conan制品仓,资源复用。
使用方法
shell脚本如下:
$ python conanbuild.py
Please input the supported library name (name is the folder name below conan-center-index_ohos/recipes) : zlib
['1.3', '1.2.13', '1.2.12', '1.2.11', 'all']
Please input the version from the above list : 1.3
Please set the build type (Debug or Release,empty for Release) :
Please set the compile target as static(False, default) or shared(True) :
Please input the install path(empty for xx\oh-compile-script/build/zlib/1.3/Release) :
Please set the custom source path(not necessary):
4 C#库
纯C#源码
纯c#源码的库基本上可以多平台使用,参照三方库提供的文件进行操作即可。
HarmonyOS NEXT上需要通过团结引擎出包然后再DevEco Studio上编译验证。
C/C++和C#混编
C/C++部分可以按照第一节操作,然后编译出来的so或是.a文件放在DevEco Studio中使用即可。
C#部分可按照纯C#源码操作进行验证。
带aar包的插件
aar包Android的功能合集,我们可以通过aar包解压出jar包,分析其接口功能。然后再针对接口实现HarmonyOS NEXT的功能。
提供har包替代aar包供C#使用。
5 检查和验证
检查
- 同时编译.a和.so文件,如果都能编译成功可进行下一步检查
- 通过file命令检查so文件平台信息
验证
- 可以从三方库中找到测试用例,使用DevEco Studio创建一个简单的示例项目验证。将编译后得到的.a文件或是.so文件添加在DevEco Studio中编写一个简单实例工程进行验证。三方库源码中一般会自带测试用例,可选其中一两个案例验证。
- 复杂的库,可直接在项目中验证,比如Physx。
6 参考文档
原文链接:华为开发者文章
更多问题可关注:
鸿蒙游戏官方网站:已有游戏移植-鸿蒙游戏-华为开发者联盟
公开课:华为开发者学堂