1# 基于NDK编译三方库 2 3## OpenHarmony NDK获取方式 41. 获取已发布版本,参考:[OpenHarmony Release Notes](https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes#openharmony-release-notes),选择对应版本,在“从镜像站点获取”小节下载对应版本SDK包,NDK包含在SDK包中。 5 62. 获取每日构建版本,每日构建地址:[OpenHarmony dailybuilds](http://ci.openharmony.cn/dailys/dailybuilds),在每日构建形态组件中选择"ohos-sdk",下载对应SDK包,NDK包含在SDK包中。 7 83. 获取源码构建版本,参考:[sourcecode acquire](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/sourcecode-acquire.md),下载OpenHarmony源码,执行以下命令编译SDK: 9 (1)若首次编译OpenHarmony源码,需要安装依赖:`./build/build_scripts/env_setup.sh`,完成后执行:`source ~/.bashrc` 10 (2)下载预编译工具链:`./build/prebuilts_download.sh` 11 (3)编译SDK:`./build.sh --product-name ohos-sdk` 12 (4)生成SDK所在路径:`out/sdk/packages` 13 14SDK包目录结构如下图,其中native即为NDK 15``` 16├── linux 17│ ├── ets-linux-x64-4.0.6.5-Canary1.zip 18│ ├── js-linux-x64-4.0.6.5-Canary1.zip 19│ ├── native-linux-x64-4.0.6.5-Canary1.zip 20│ ├── previewer-linux-x64-4.0.6.5-Canary1.zip 21│ └── toolchains-linux-x64-4.0.6.5-Canary1.zip 22└── windows 23 ├── ets-windows-x64-4.0.6.5-Canary1.zip 24 ├── js-windows-x64-4.0.6.5-Canary1.zip 25 ├── native-windows-x64-4.0.6.5-Canary1.zip 26 ├── previewer-windows-x64-4.0.6.5-Canary1.zip 27 └── toolchains-windows-x64-4.0.6.5-Canary1.zip 28``` 29 30## OpenHarmony NDK目录 31``` 32native 33├── NOTICE.txt 34├── build # cmake工具链的配置 35├── build-tools # cmake工具链目录 36├── docs 37├── llvm # llvm编译器工具链 38├── nativeapi_syscap_config.json # NDK提供的SystemCapability的相关头文件 39├── ndk_system_capability.json # NDK提供的SystemCapability的描述文件 40├── oh-uni-package.json # 版本信息 41└── sysroot # NDK包含的库文件和头文件 42``` 43 44## 使用OpenHarmony NDK编译三方库 451. 解压NDK压缩包,将cmake工具链添加到环境变量中:`export PATH=${SDK解压路径}/ohos-sdk/linux/native/build-tools/cmake/bin:${PATH}` 46 472. 安装make:`sudo apt install make` 48 493. 示例 50- **demo目录** 51``` 52├── CMakeLists.txt 53├── include 54│ └── shared 55│ └── Hello.h 56└── src 57 ├── CMakeLists.txt 58 ├── Hello.cpp 59 └── main.cpp 60``` 61 62- **CMakeLists.txt** 63``` 64CMAKE_MINIMUM_REQUIRED(VERSION 3.16) 65 66PROJECT(HELLO_LIBRARY) 67 68ADD_SUBDIRECTORY(src) 69``` 70 71- **src/CMakeLists.txt** 72``` 73SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/output) 74SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/output) 75 76############################################################ 77# Create a library 78############################################################ 79 80#Generate the shared library from the library sources 81ADD_LIBRARY(hello_shared_library SHARED 82 Hello.cpp 83 ) 84ADD_LIBRARY(hello::library ALIAS hello_shared_library) 85 86TARGET_INCLUDE_DIRECTORIES(hello_shared_library 87 PUBLIC 88 ${PROJECT_SOURCE_DIR}/include 89 ) 90 91############################################################ 92# Create an executable 93############################################################ 94 95# Add an executable with the above sources 96ADD_EXECUTABLE(hello_shared_binary 97 main.cpp 98 ) 99 100# link the new hello_library target with the hello_binary target 101TARGET_LINK_LIBRARIES( hello_shared_binary 102 PRIVATE 103 hello::library 104 ) 105``` 106 107- **Hello.h** 108``` 109#ifndef __HELLO_H__ 110#define __HELLO_H__ 111 112class Hello 113{ 114public: 115 void print(); 116}; 117 118#endif 119``` 120 121- **Hello.cpp** 122``` 123#include <iostream> 124 125#include "shared/Hello.h" 126 127void Hello::print() 128{ 129 std::cout << "Hello Shared Library!" << std::endl; 130} 131``` 132 133- **main.cpp** 134``` 135#include "shared/Hello.h" 136 137int main(int argc, char *argv[]) 138{ 139 Hello hi; 140 hi.print(); 141 return 0; 142} 143``` 144 1454. 编译: 146``` 1471. mkdir build && cd build 1482. cmake -DOHOS_STL=c++_shared -DOHOS_ARCH=x86_64 -DOHOS_PLATFORM=OHOS -DCMAKE_TOOLCHAIN_FILE=${SDK解压路径}/ohos-sdk/linux/native/build/cmake/ohos.toolchain.cmake .. && make 149 150# 参数解释: 151# OHOS_STL:默认c++_shared,可选c++_static 152# OHOS_ARCH: 默认arm64-v8a,可选armeabi-v7a、x86_64 153# OHOS_PLATFORM:仅支持OHOS 154# CMAKE_TOOLCHAIN_FILE:cmake的工具链的配置文件所在路径 155``` 156 1575. 编译产物: 158``` 159output/ 160├── hello_shared_binary 161└── libhello_shared_library.so 162``` 163