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