ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【鸿蒙】跨平台三方框架(一)-迁移三方库到鸿蒙(还差源码未调试完,调试 [打印本页]

作者: 惊落一身雪    时间: 2025-1-25 19:22
标题: 【鸿蒙】跨平台三方框架(一)-迁移三方库到鸿蒙(还差源码未调试完,调试
在学习这篇文章之前,大家首先要明白几件事情
问:为什么要迁移三方库,目地意义在哪?
答:不知道大家是否相识NDK或者napi框架,如果相识就很好理解,如果不相识咱们换一个方向表明,我们在前端做一个界面,在这个界面里肯定会涉及到组件结构调用接口等,那假设咱们公司要去做短信验证的这个功能,是不是需要有个接二维码的服务,但由于团队职员不够也不想费更多的人力投入这件事中,咱们需要外部引入部门接口去调用。或者如果我们要去做金融的借贷平台,但是不知道能否借给这个人款,他的信用怎么样,我们就要对接银行的API,往复查询这个人的信用状况。再比如我们要实现一个播放视频的功能,已经创建了窗口可以播放视频,但是音频有问题,咱们就可以编译三方库调用三方库的接口,来利用我们所需要的内部逻辑。
问:为什么要执行交织编译?
答:在嵌入式开发中,交织编译开源软件是一个常见的任务,它涉及到将源代码编译成能够在目标嵌入式平台上运行的二进制文件。由于嵌入式平台的硬件架构和操纵体系可能与开发呆板差别,因此需要利用交织编译工具链来完成这一任务。


  
上述已经说了为什么迁移三方库,下面就开始进入流程,手把手教大家怎样编译怎样迁移:
一、移植思路

1、通过修改工具链,交织编译该三方库,天生OpenHarmony平台的可执行文件,末了再通过GN调用CMake的方式添加到OpenHarmony工程中。
必备知识点:linux、shell脚本、交织编译链、cmake、Makefile、Configure、ninja、gn等
额外知识点:native、napi
二、三方库交织编译框架及迁移三方库流程图

- 三方库交织编译框架


- 迁移三方库流程图


三、逐步分析流程图

- 编译前:

涉及的环境工具

Ubuntu、MobaXterm_Personal(或者xshell)、vscode、Git/TortoiseGit、Beyond Compare
环境工具相识及扩展


简述步骤

准备环境->下载鸿蒙sdk->配置环境变量
具体步骤

第一步先准备环境:我一样平常在linux上去交织编译,所以我会下Ubuntu 终端,另有MobaXterm_Personal,
- 编译中:

涉及知识点

linux下令、shell脚本、cmake\configure、交织编译链、Makefile
知识点相识及扩展


简述步骤

一共有四种方法
1、(用的最多的方法)先相识自己项目依赖什么三方库->在github里/官网中下载三方库源码->设置鸿蒙sdk交织编译链全局变量->打开三方库源码看build脚本及cmake或者configure构建去编译出动态库或者静态库(如有涉及别的依赖库需要写脚本或者手动拉取去编译)->出动态库或者静态库放入Dev中去测
2、(也是用的最多-简朴一点直接利用鸿蒙仓库适配好的) OpenHarmony-SIG/tpc_c_cplusplus这个仓库重要用于存放已经适配OpenHarmony的C/C++三方库的适配脚本和OpenHarmony三方库适配引导文档、三方库适配相关的工具。编译的三方组件在tpc_c_cplusplus仓里去找(路径 tpc_c_cplusplus/ thirdparty )->设置鸿蒙sdk交织编译链全局变量->找到后用 ./build 组件名 编译(需要32位还是64位自行在脚本内删除archs=(“armeabi-v7a” “arm64-v8a”),有相关的也需要进行屏蔽)->出动态库或者静态库放入Dev中去测
3、(有些项目是私有三方库,没有cmake或者configure这些构建方式也不想写重构代码用这个方法)Dev创建c++项目->把私有三方库源码放入Dev中的cpp路径->改写Dev中的CMakeLists(路径:DevEcoStudioProjects\MyApplication5\entry\src\main\cpp\CMakeLists.txt)->Dev编译调试
4、(不建议利用,需要重构代码费时间。原理跟第3种方法很像,但是这类方法只需要挑选出咱们需要调用的逻辑去重构)看私有三方库代码,需要列出三方库的接口及逻辑->鸿蒙一样平常利用napi作为c++底层和js上层的连接,把代码内部逻辑写在Dev项目里,用napi接口调用重构的逻辑->改写Dev中的CMakeLists->Dev编译调试
具体步骤

前期环境搭建


  1. //解压linux的SDK,下面有步骤图示
  2. tar -zxvf  version-Master_Version-OpenHarmony_5.0.0.32_dev-20240715_020215-ohos-sdk-full.tar.gz
  3. unzip /mnt/d/SDK/sdk/linux/ets-linux-x64-5.0.0.33-Canary2.zip
  4. unzip /mnt/d/SDK/sdk/linux/js-linux-x64-5.0.0.33-Canary2.zip
  5. unzip /mnt/d/SDK/sdk/linux/native-linux-x64-5.0.0.33-Canary2.zip
  6. unzip /mnt/d/SDK/sdk/linux/previewer-linux-x64-5.0.0.33-Canary2.zip
  7. unzip /mnt/d/SDK/sdk/linux/toolchains-linux-x64-5.0.0.33-Canary2.zip
复制代码



windows的sdk配置

linux解压sdk
  1. //OHOS_SDK是你存linux SDK的路径,我上面图的位置是/mnt/d/SDK/sdk/linux下,这个位置是可以改变的,随你自己存储的位置决定
  2. export OHOS_SDK=/root/workspace/openharmony
  3. //下面的基本每个人交叉编译的设置都是一样的,顶多额外设置一些其他编译链或者链接库
  4. export AS=${OHOS_SDK}/native/llvm/bin/llvm-as
  5. export CC="${OHOS_SDK}/native/llvm/bin/clang --target=aarch64-linux-ohos"
  6. export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=aarch64-linux-ohos"
  7. export LD=${OHOS_SDK}/native/llvm/bin/ld.lld
  8. export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip
  9. export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib
  10. export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump
  11. export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy
  12. export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm
  13. export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar
  14. export CFLAGS="-fPIC -D__MUSL__=1"
  15. export CXXFLAGS="-fPIC -D__MUSL__=1"
复制代码

5. 额外可能还需要下载一些依赖工具,或者配置阿里源(需要的话可以下拉并配置,链接里有方法):【OpenHarmony】环境安装及代码下拉开发编译操纵总结
步骤里的第一、第二方法一块讲

对比一二方法区别与简述图示


1、先相识下自己需要什么三方库或者客户需要什么三方库,比如视频的需要FFmpeg,关于密钥,ssh等需要openssl,人脸需要opencv,关于数据储存和通讯协议的话需要protobuf等等。
2、可以自己交织编译三方库(第一个方法)也可以用鸿蒙仓上的去编译三方库(第二个方法)

  1. echo 'configuring libjson ...'
  2. tar zxvf ${libsources}/libjson_client.tar.gz
  3. cd libjson
  4. mkdir build
  5. cd build
  6. # cmake -DDEFINE_LINUX64=ON -DCMAKE_INSTALL_PREFIX=$prefixroot ../
  7. /home/SDK/native/build-tools/cmake/bin/cmake -DCMAKE_TOOLCHAIN_FILE=/home/SDK/native/build/cmake/ohos.toolchain.cmake  .. -L -DDEFINE_LINUX64=ON -DCMAKE_INSTALL_PREFIX=$prefixroot ../
  8. make
  9. make install
  10. cd ..
  11. cd ..
  12. echo 'configuring openssl ...'
  13. tar zxvf ${libsources}/openssl-1.0.2l.tar.gz
  14. cd openssl-1.0.2l
  15. if [ "$(uname -m)" = "arm64" ]; then
  16.     ./Configure --prefix=$prefixroot --openssldir=$prefixroot/ssl  
  17. elif [ "$(uname -s)" = "Linux" ]; then
  18.     ./Configure shared $CONFIGURE_ARGS linux-aarch64 --prefix=$prefixroot --openssldir=$prefixroot/ssl
  19. else
  20.     echo "Unsupported OS or architecture for OpenSSL compilation."
  21.     exit 1
  22. fi
  23. make -j10
  24. make install
  25. cd ..
  26. echo 'configuring protobuf ...'
  27. tar zxvf ${libsources}/protobuf-all-3.13.0.tar.gz
  28. cd protobuf-3.13.0
  29. ./autogen.sh
  30. ./configure --host=aarch64-linux CFLAGS="-fPIC" CXXFLAGS="-fPIC" --disable-protoc
  31. make -j10
  32. make install
  33. 定义目录路径
  34. bin_dir="$prefixroot/bin"
  35. include_dir="$prefixroot/include"
  36. lib_dir="$prefixroot/lib"
  37. 判断目录是否存在
  38. if [ ! -d "$bin_dir" ]||[ ! -d "$include_dir" ]|| [ ! -d "$lib_dir" ]; then
  39.     echo "目录文件不存在正在创建..."
  40.     mkdir -p $bin_dir
  41.     echo "目录 $bin_dir 已存在"
  42.     mkdir -p $include_dir
  43.     echo "目录 $include_dir 已存在"
  44.     mkdir -p $lib_dir
  45.     echo "目录 $lib_dir 已存在"
  46. fi
  47. cp -rf /usr/local/bin/protoc $prefixroot/bin/
  48. cp -rf /usr/local/include/google $prefixroot/include/
  49. cp -rf /usr/local/lib/*proto* $prefixroot/lib/
  50. cp -rf /usr/local/lib/pkgconfig/* $prefixroot/lib/pkgconfig/
  51. cd ..
复制代码

  1. echo 'configuring boost ...'
  2. # $tpc_c_cplusplus_dir选取OpenHarmony三方库在本地具体路径
  3. tpc_c_cplusplus_dir="/home/tpc_c_cplusplus"  
  4. boost_include_dir="$tpc_c_cplusplus_dir/lycium/usr/boost/arm64-v8a/include"  
  5. boost_lib_dir="$tpc_c_cplusplus_dir/lycium/usr/boost/arm64-v8a/lib"
  6. if [ ! -d "$prefixroot/include" ]||[ ! -d "$prefixroot/lib" ]; then
  7.     echo "目录文件不存在正在创建..."
  8.     mkdir -p $prefixroot/include
  9.     echo "目录 $prefixroot/include 已存在"
  10.     mkdir -p $prefixroot/lib
  11.     echo "目录 $prefixroot/lib 已存在"
  12. fi
  13. # 检查 include 目录是否存在
  14. if [ ! -d "$boost_include_dir" ]; then
  15.     echo "Boost include directory does NOT exist: $boost_include_dir"
  16.     cd /home
  17.     #下载鸿蒙三方开源boost
  18.     git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git
  19.     cd tpc_c_cplusplus/lycium/
  20.     #更新依赖工具的命令,如果ninja安不上可以查看文档:https://blog.csdn.net/weixin_60917883/article/details/133990450?spm=1001.2014.3001.5502
  21.     sudo apt-get update
  22.     sudo apt-get install cmake pkg-config autoconf ninja-build
  23.     ./build.sh boost
  24.     echo "Boost include directory generated and copied"
  25.     cp -rf "$boost_include_dir"/* "$prefixroot/include/"
  26. else
  27.     echo "Boost include directory exists: $boost_include_dir"
  28.     cp -rf "$boost_include_dir"/* "$prefixroot/include/"
  29. fi
  30. # 检查 lib 目录是否存在
  31. if [ ! -d "$boost_lib_dir" ]; then
  32.     echo "Boost library directory does NOT exist: $boost_lib_dir"
  33.     echo "Judging that boost_include_dir has already been successfully obtained"
  34.     # boost_lib_dir路径从判断boost_include_dir就已经获取到了,然后复制
  35.     cp -rf "$boost_lib_dir"/* "$prefixroot/lib/"
  36. else
  37.     echo "Boost library directory exists: $boost_lib_dir"
  38.     cp -rf "$boost_lib_dir"/* "$prefixroot/lib/"
  39. fi
  40. cd "$prefixroot"
复制代码
步骤里的第三、第四方法一块讲

相关文档参考:通过IDE集成非cmake方式构建的C/C++三方库
对比三四方法区别与简述图示


1、在Dev中创建c++项目
2、把自己需要移植的代码下载下来

- 编译后:

涉及知识点:napi、native、ndk、js、ets、hap

知识点相识及扩展

简述步骤

编译出第三方库放入Dev->袒露napi接口调用底层c++逻辑->写js前端代码调napi回调->调试
具体步骤

Node.js v22.9.0 文档

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4