• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# NAPI框架生成代码集成到OpenHarmony的方法
2
3## 场景说明
4
5为了实现工具生成的接口被其他子系统或者应用调用,需将生成的代码编译集成到OpenHarmony系统中,使其生成动态库,供OpenHarmony应用层调用。
6本文介绍如何将工具生成的源码利用OpenHarmony编译系统生成动态库供应用层调用,主要是有以下两种方式,分别为增加ohos.build文件方式和增加bundle.json文件方式。
7
8## ohos.build方式集成
9### 建立模块位置
10
11模块目录理论上可以建立在OpenHarmony代码库的任何地方,假设OpenHarmony代码库的目录为`OHOS_SRC`,在`OHOS_SRC/foundation`目录下,例如建立此次测试模块目录:napitest。此时,`OHOS_SRC/foundation`目录下应该有aafwk,ace,ai, …, napitest等目录,其中napitest就是刚刚建立的,在napitest目录下,把之前用可执行文件或者插件转换出来的文件全部拷贝到该目录下,并且在该目录下新建一个文件ohos.build。例如napitest目录下有以下文件:
12
13    foundation/napitest
14    |-- binding.gyp
15    |-- BUILD.gn
16    |-- ohos.build
17    |-- napitest.cpp
18    |-- napitest.h
19    |-- napitest_middle.cpp
20    |-- test.sh
21    |-- tool_utility.cpp
22    |-- tool_utility.h
23
24### 编译修改点
25
26#### 修改build.gn文件
27
28```
29	import("//build/ohos.gni")
30
31	ohos_shared_library("napitest")
32	{
33    	# 指定编译源文件
34    	sources = [
35        	"napitest_middle.cpp",
36        	"napitest.cpp",
37        	"tool_utility.cpp",
38    	]
39    	include_dirs = [
40        	".",
41        	"//third_party/node/src",
42    	]
43    	# 指定编译依赖,如果依赖第三方库,需要在此添加
44    	deps=[
45        	"//foundation/ace/napi:ace_napi",
46        	"//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog",
47    	]
48    	remove_configs = [ "//build/config/compiler:no_rtti" ]
49    	cflags=[
50    	]
51    	cflags_cc=[
52        	"-frtti",
53    	]
54    	ldflags = [
55    	]
56    	# 指定库生成的路径
57    	relative_install_dir = "module"
58    	# 主要是修改下面两条内容,子系统及其组件,后面会引用
59    	part_name = "napitest_interface"
60    	subsystem_name = "napitest"
61	}
62```
63
64#### 修改ohos.build文件
65其中module_list选项中的"//foundation/napitest"指的是napitest目录,":napitest"指的是上面BUILD.gn中的目标ohos_shared_library("napitest")。
66
67```
68{
69  "subsystem": "napitest",
70  "parts": {
71    "napitest_interface": {
72      "module_list": [
73        "//foundation/napitest:napitest"
74      ],
75      "test_list": []
76    }
77  }
78}
79```
80
81#### 修改napitest.cpp文件
82
83为方便调试,在napitest.cpp文件或napitest_middle.cpp文件中加入打印日志语句。以修改napitest.cpp文件为例,增加以下代码:
84
85
86```
87	#include "napitest.h"
88	#include <hilog/log.h>
89	using namespace OHOS;
90	namespace {
91	constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, 0, "NAPITESTNAPILayer" };
92	#define NAPITEST_LOG(fmt, ...) HiviewDFX::HiLog::Info(LABEL, \
93    	"%{public}s:%{public}d " fmt, __func__, __LINE__, ##__VA_ARGS__)
94	}
95	namespace napitest {
96		bool fun1(std::string &v, std::string &out)
97		{
98    		NAPITEST_LOG("napitest fun1 begin!!!!!!!!!!!!!!");
99    		return true;
100		}
101	}
102```
103#### 增加子系统
104
105在源码/build/subsystem_config.json中增加子系统选项。如下所示:
106
107```
108"napitest": {
109    "project": "hmf/napitest",
110    "path": "foundation/napitest",
111    "name": "napitest",
112    "dir": "foundation"
113  }
114```
115
116### 添加功能模块
117在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码/productdefine/common/products/rk3566.json中增加part选项,其中napitest就是上面填的subsystem_name,napitest_interface就是上面填的part_name。
118
119    "napitest:napitest_interface":{}
120
121### 编译验证
122
123编译成功后,就会生成libnapitest.z.so,目录如下所示:
124
125    /out/ohos-arm-release/packages/phone/system/lib/module
126
127## bundle.json方式集成
128### 建立模块位置
129
130模块目录理论上可以建立在OpenHarmony代码库的任何地方,假设OpenHarmony代码库的目录为`OHOS_SRC`,在`OHOS_SRC/foundation`目录下,例如建立此次测试模块目录:napitest。此时,`OHOS_SRC/foundation`目录下应该有aafwk,ace,ai, …, napitest等目录,其中napitest就是刚刚建立的,在napitest目录下,把之前用可执行文件或者插件转换出来的文件全部拷贝到该目录下,并且在该目录下新建一个文件bundle.json。例如napitest目录下有以下文件:
131
132    foundation/napitest
133    |-- binding.gyp
134    |-- BUILD.gn
135    |-- bundle.json
136    |-- napitest.cpp
137    |-- napitest.h
138    |-- napitest_middle.cpp
139    |-- test.sh
140    |-- tool_utility.cpp
141    |-- tool_utility.h
142
143### 编译修改点
144
145#### 修改build.gn文件
146
147```
148
149	import("//build/ohos.gni")
150
151	ohos_shared_library("napitest")
152	{
153    	# 指定编译源文件
154    	sources = [
155        	"napitest_middle.cpp",
156        	"napitest.cpp",
157        	"tool_utility.cpp",
158    	]
159    	include_dirs = [
160        	".",
161        	"//third_party/node/src",
162    	]
163    	# 指定编译依赖,如果依赖第三方库,需要在此添加
164    	deps=[
165        	"//foundation/ace/napi:ace_napi",
166        	"//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog",
167    	]
168    	remove_configs = [ "//build/config/compiler:no_rtti" ]
169    	cflags=[
170    	]
171    	cflags_cc=[
172        	"-frtti",
173    	]
174    	ldflags = [
175    	]
176    	# 指定库生成的路径
177    	relative_install_dir = "module"
178    	# 主要是修改下面两条内容,子系统及其组件,后面会引用
179    	part_name = "napitest_interface"
180    	subsystem_name = "napitest"
181	}
182```
183
184#### 修改bundle.json文件
185其中destPath选项中的"//foundation/napitest"指的是napitest目录,":napitest"指的是上面BUILD.gn中的目标ohos_shared_library("napitest")。
186
187```
188{
189  "name": "@ohos/napitest",
190  "description": "napitest provides atomic capabilities",
191  "version": "3.1",
192  "license": "Apache License 2.0",
193  "publishAs": "code-segment",
194  "segment": {
195    "destPath": "foundation/napitest"
196  },
197  "dirs": {},
198  "scripts": {},
199  "component": {
200    "name": "napitest_interface",
201    "subsystem": "napitest",
202    "features": [],
203    "adapted_system_type": [
204      "standard"
205    ],
206    "rom": "10000KB",
207    "ram": "10000KB",
208    "deps": {
209      "components": [
210        "ace_napi",
211        "ipc_core",
212        "libhilog"
213      ],
214      "third_party": [
215        "node"
216      ]
217    },
218    "build": {
219      "sub_component": [
220        "//foundation/napitest:napitest"
221      ],
222      "inner_kits": [
223        {
224          "header": {
225            "header_base": "//foundation/napitest",
226            "header_files": [
227              "tool_utility.h",
228              "napitest.h"
229            ]
230          },
231          "name": "//foundation/napitest:napitest"
232        }
233      ]
234    }
235  }
236}
237```
238
239#### 修改napitest.cpp文件
240为方便调试,在napitest.cpp文件或napitest_middle.cpp文件中加入打印日志语句。以修改napitest.cpp文件为例,增加以下代码:
241
242
243```
244	#include "napitest.h"
245	#include <hilog/log.h>
246	using namespace OHOS;
247	namespace {
248	constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, 0, "NAPITESTNAPILayer" };
249	#define NAPITEST_LOG(fmt, ...) HiviewDFX::HiLog::Info(LABEL, \
250    	"%{public}s:%{public}d " fmt, __func__, __LINE__, ##__VA_ARGS__)
251	}
252	namespace napitest {
253		bool fun1(std::string &v, std::string &out)
254		{
255    		NAPITEST_LOG("napitest fun1 begin!!!!!!!!!!!!!!");
256    		return true;
257		}
258	}
259```
260#### 增加子系统
261
262在源码/build/subsystem_config.json中增加子系统选项。如下所示:
263
264```
265"napitest": {
266    "project": "hmf/napitest",
267    "path": "foundation/napitest",
268    "name": "napitest",
269    "dir": "foundation"
270  }
271```
272
273### 添加功能模块
274在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码/productdefine/common/products/rk3566.json中增加part选项,其中napitest就是上面填的subsystem_name,napitest_interface就是上面填的part_name。
275
276    "napitest:napitest_interface":{}
277
278### 编译验证
279
280编译成功后,就会生成libnapitest.z.so,目录如下所示:
281
282    /out/ohos-arm-release/packages/phone/system/lib/module
283
284## 总结
285
286两种集成方式使用场景说明:
287
288ohos.build方式集成:适合3.0前版本使用。
289
290bundle.json方式集成:兼容ohos.build方式,但3.1及以后版本建议使用此种方式集成。
291
292