#创作者激励#[触觉智能RK3568]OpenHarmony NDK工具① 原创 精华
【本文正在参加2023年第一期优质创作者激励计划】
在OpenHarmony应用开发中选择Native C ++开发方式需要使用OpenHarmony NDK工具,或者想移植一个C/C ++的三方库到OpenHarmony中也可以使用NDK。NDK使用到的编译工具是cmake,也就是CMakeLists.txt那一套。Native C ++应用开发方式可以做直接编译三方库的so库再利用NAPI框架实现能力的调用(只需要在三方库原生的CMakeLists.txt中修改小部分的内容就可以实现)。
目录
一、OpenHarmony NDK
- NDK (原生开发套件) 是一套工具,使开发者能够在 OpenHarmony hap应用中使用 C/C++ 代码。
- NDK提供了一系列的工具可以帮助开发者快速的开发C/C++的动态库、静态库和可执行文件。
- OpenHarmony 应用开发的Native C++开发方式就要依赖NDK。NDK被包含在OpenHarmony SDK中。可以在DevEco Studio使用 NDK 将 C/C ++ 代码编译到so库中,然后使用 DevEco Studio 的构建插件hvigor-ohos-plugin将so库打包到 Hap 中。ArkTS代码随后可以通过NAPI框架调用SO库中的函数。
二、获取NDK的方式
2.1 从每日构建中获取
-
每日构建地址: http://ci.openharmony.cn/workbench/cicd/dailybuild/assemblyline
-
组件形态选择
ohos-sdk
,版本选择最新版本的sdk一般是没有问题的(但是笔者之前遇到下载的ndk中的clang工具找不到libatomic.so无法工作的情况的情况)
-
下载解压后可以得到如下文件,根据linux或者windows端解压不同文件得到sdk
2.2 编译源码得到SDK中的NDK
写文章提的issue https://gitee.com/openharmony/build/issues/I6H8IO?from=project-issue
- 在对应的目录底下找到编译成功的NDK,相关路径out/sdk/packages/ohos-sdk/linux/native,根据linux或者windows端解压不同文件得到sdk
二、NDK目录
- llvm中bin目录下的编译器有
三、linux下使用NDK编译库文件和可执行文件
3.1 使用NDK编译一个简单demo
- 在这里使用这个OpenHarmony仓库的这个demo https://gitee.com/openharmony/third_party_musl/tree/master/ndk-test/ndk-test/src/shared-library 这个demo编译前的目录结构
- 外部CMakeLists.txt
cmake的内置命令是不区分大小写的,因此add_subdirectory与ADD_SUBDIRECTORY作用一致。但是cmake的所有变量都是区分大小写的
- 内部CMakeLists.txt
3.2 进行cmake编译
3.2.1 NDK自带的cmake编译工具添加到环境变量
1、第一种方法:
2、第二种方法:
3、查看环境变量添加是否成功
可知cmake的版本是3.16.5 ,所以编写CMakeLists.txt可参考的链接为 https://cmake.org/cmake/help/v3.16/guide/tutorial/
3.2.2 安装make
- 如果没有安装make会出现以下报错,则执行
sudo apt-get install make
。(如果已经安装make,请忽略)
3.2.3 cmake的几个参数
1、OHOS_STL
参数,其类型可以是c++_shared
和c++_static
,默认是c++_shared
2、OHOS_ARCH
参数(设置应用程序二进制接口ABI),其类型是armeabi-v7a
、x86_64
,默认值是arm64-v8a
。每一种ABI定义了相应的二进制文件。
armeabi-v7a
(选择这个是编译32位的二进制文件)arm64-v8a
(选择这个是编译64位的二进制文件)x86_64
(现在不使用,OpenHarmony现在在适配x86的芯片)
3、OHOS_PLATFORM
参数,其类型为OHOS
(只能选择OHOS平台)
4、 CMAKE_TOOLCHAIN_FILE
参数指向的是工具链文件所在的位置,就是ohos.toolchain.cmake
的路径(对于编译不同平台二进制文件是很重要的)。
- build目录中的工具链文件ohos.toolchain.cmake,cmake编译时需要读取该文件中的默认值,比如编译器的选择、编译平台,例如ohos.toolchain.cmake文件中,
- 在编译时需要指出该文件的所在路径,以便于cmake在编译时定位到该文件。在编译的时候需要为cmake指定参数来控制编译目标的属性。
3.2.4 使用CMake进行构建,并传递工具链文件及cmake参数
1、执行如下过程如下:
2、可以注意到执行cmake --build .
时会有warning: -Wunused-command-line-argument
,
通过在内部的CMakeLists.txt中添加如下语句消除warning。
- 注意:.c文件时是使用CMAKE_C_FLAGS,.cpp文件时是使用CMAKE_CXX_FLAGS
3、编译结果如下:
生成可执行文件和动态库
4、要编译静态库及其可执行文件,内部的CMakeLists.txt中添加如下语句
编译结果如下,生成静态库及其可执行文件
5、编译64位的库文件和可执行文件,OHOS_ARCH参数选择arm64-v8a或者编译时不传递该参数。
3.4.5 使用CMake进行构建,选择ninja生成器并生成编译流程图
1、执行cmake -G
查看linux环境下的生成器,ndk中自带的生成器是Ninja。
2、使用CMake进行构建时添加上-G “Ninja”
执行完第二步后,build目录下会生成build.ninja,有了build.ninja可以使用ninja生成程序的编译流程图。
3、使用ninja工具生成库文件和可执行文件的编译流程图。
如果生成图片格式太小的话,可以生成svg格式到浏览器打开,这一点很重要,请参考该 issue
3.4.6 使用NDK中的cmake-gui进行图形化操作编译
1、native/build-tools/cmake/bin目录有cmake-gui,可以用它图形化传入编译参数进行编译。
2、首先点击Where is source code
行的Browser Source
,加载工程所在目录。
再点击Where to build the binarys
行的Browser Source
,加载点击“Where is source code”行的Browser Source,加载源码所在目录。
点击“Where to build the binarys行的Browser Source,加载工程所在目录下的build目录(没有就创建一个)。
3、点击Add Entry
传入cmake 参数。勾选把旁边的Grouped
选项。
4、点击Configure
选择Current Generator
生成器为Unix Makefiles
。
5、最后打开Where to build the binarys
加载构建目录终端,执行make -j 8
命令
make -j n含义是 让make最多允许n个编译命令同时执行,这样可以更有效的利用CPU资源。假设系统cpu是12核,在不影响其他工作的情况下,我们可以make -j 12将cpu资源充分利用起来,一般来说,最大并行任务数为cpu_num * 2。
写文章提的issue https://gitee.com/openharmony/third_party_musl/issues/I6JRBU?from=project-issue
通过每日构建窥见大佬们的工作进度
希望早日也能和作者一样为开源做贡献
大佬,怎么入门openharmony啊?本人大一纯小白
《OpenHarmony设备开发入门手册(2023年)》适用3.1Release以上-开源基础软件社区-51CTO.COM
多和官方沟通看来是解决问题的重要途径(要是能快点反馈就好了)
我有时候提issue能很快得到回复,有时候被无视。说多了都是泪
为什么我把生成的hello_static_binary放到dayu200开发板上运行不起来呢?报了下面的错误
#创作者激励#使用OpenHarmonyNDK移植三方库Speexdsp-开源基础软件社区-51CTO.COM换成这种方式吧,在ide里面调用ndk