开源三方库HarmonyOS NEXT适配指导

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文件夹中,仅简单介绍此部分中内容。

cke_185.png

1. build: 防止预定义的toolchain脚本文件ohos.toolchain.cmake。 

cke_186.png

CMake编译时需要读取该文件中的默认值,比如编译器架构、C++库链接方式等,因此在编译时会通过CMAKE_TOOLCHAIN_FILE指出该文件的路径,便于CMake在编译时定位到该文件。

2. build-tools:放置NDK提供的编译工具。

CMake构建系统编译三方库过程中主要使用cmake和ninja。

3. docs:Native接口api文档。

4. llvm:放置NDK提供的编译器。

cke_188.png

5. sysroot:HarmonyOS NEXT SDK的Native依赖及头文件。

cke_189.png

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文件较为相似。

使用原生的构建工具

使用原生的构建工具,需要针对环境进行配置,一般建议在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官方文档网站

优势

  1. 拿来即用,已收录100+常用三方库的多个版本。
  2. 不需要考虑三方库依赖问题,依赖关系已处理。
  3. 可快速适配新版本三方库源码,保持三方库更新。
  4. 使用简单,一条命令可完成编译。
  5. 环境安装简单,安装Python和Conan即可。
  6. 跨平台多端可以,支持Linux和Windows平台下交叉编译。
  7. 方便归档,可搭建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 检查和验证

检查

  1. 同时编译.a和.so文件,如果都能编译成功可进行下一步检查
  2. 通过file命令检查so文件平台信息

cke_192.png

验证

  1. 可以从三方库中找到测试用例,使用DevEco Studio创建一个简单的示例项目验证。将编译后得到的.a文件或是.so文件添加在DevEco Studio中编写一个简单实例工程进行验证。三方库源码中一般会自带测试用例,可选其中一两个案例验证。
  2. 复杂的库,可直接在项目中验证,比如Physx。

6 参考文档


原文链接:华为开发者文章


 更多问题可关注:

鸿蒙游戏官方网站:已有游戏移植-鸿蒙游戏-华为开发者联盟

公开课:华为开发者学堂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值