• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 集成到OpenHarmony 3.1 Release的方法
2
3## 场景说明
4
5为了实现工具生成的接口被其它子系统或者应用调用,需将生成的代码编译集成到OpenHarmony系统中,使其生成动态库,供OpenHarmony应用层调用。
6本文介绍如何将工具生成的源码利用OpenHarmony编译系统生成动态库供应用层调用,集成到OpenHarmony 3.1 Release主要是有以下两种方式,分别为增加ohos.build文件方式和增加bundle.json文件方式。
7
8## 3.1 版本
9
10### bundle.json方式集成
11
12#### 建立模块位置
13
14模块目录理论上可在OpenHarmony工程的任一位置,假设OpenHarmony代码库的目录为OHOS_SRC,在OHOS_SRC/foundation目录下,建测试模块目录:napitest。napitest目录结构如下:
15
16    napitest
17    |-- binding.gyp
18    |-- BUILD.gn
19    |-- bundle.json
20    |-- napitest.cpp
21    |-- napitest.h
22    |-- napitest_middle.h
23    |-- napitest_middle.cpp
24    |-- test.sh
25    |-- tool_utility.cpp
26    |-- tool_utility.h
27
28其中bundle.json为新增的编译配置文件,其它为工具生成的代码。
29
30#### 编译修改点
31
32##### 修改BUILD.gn文件
33
34将deps中"//foundation/arkui/napi:ace_napi"的修改为"//foundation/ace/napi:ace_napi",修改后的BUILD.gn文件内容如下所示:
35
36```
37import("//build/ohos.gni")
38
39ohos_shared_library("napitest")
40{
41    sources = [
42        "napitest_middle.cpp",
43        "../serviceCode/NodeISayHello.cpp",     # 将业务代码编译进去
44        "napitest.cpp",
45        "tool_utility.cpp",
46    ]
47    include_dirs = [
48        ".",
49        "//third_party/node/src",
50    ]
51    deps=[
52        "//foundation/ace/napi:ace_napi",
53        "//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog",
54    ]
55    remove_configs = [ "//build/config/compiler:no_rtti" ]
56    cflags=[
57    ]
58    cflags_cc=[
59        "-frtti",
60    ]
61    ldflags = [
62    ]
63
64    relative_install_dir = "module"
65    part_name = "napitest"
66    subsystem_name = "napitest"
67}
68```
69
70若用户需要修改子系统和部件名称,则根据自身需求修改BUILD.gn文件和bundle.json文件中子系统与部件名称即可。
71
72##### 修改bundle.json文件
73
74其中destPath选项中的"//foundation/napitest"指的是napitest目录,":napitest"指的是上面BUILD.gn中的目标ohos_shared_library("napitest")。
75
76```
77{
78  "name": "@ohos/napitest",
79  "description": "napitest provides atomic capabilities",
80  "version": "3.1",
81  "license": "Apache License 2.0",
82  "publishAs": "code-segment",
83  "segment": {
84    "destPath": "foundation/napitest"
85  },
86  "dirs": {},
87  "scripts": {},
88  "component": {
89    "name": "napitest",
90    "subsystem": "napitest",
91    "features": [],
92    "adapted_system_type": [
93      "standard"
94    ],
95    "rom": "10000KB",
96    "ram": "10000KB",
97    "deps": {
98      "components": [
99        "ace_napi",
100        "ipc_core",
101        "libhilog"
102      ],
103      "third_party": [
104        "node"
105      ]
106    },
107    "build": {
108      "sub_component": [
109        "//foundation/napitest:napitest"
110      ],
111      "inner_kits": [
112        {
113          "header": {
114            "header_base": "//foundation/napitest",
115            "header_files": [
116              "tool_utility.h",
117              "napitest.h",
118              "napitest_middle.h"
119            ]
120          },
121          "name": "//foundation/napitest:napitest"
122        }
123      ]
124    }
125  }
126}
127```
128
129##### 修改napitest.cpp文件
130
131为方便调试,在napitest.cpp文件中增加业务代码。以修改napitest.cpp文件为例,在以下方法中增加业务代码,
132
133在sayHello方法中增加注册的object回调方法的调用:
134
135```
136...
137// 业务代码调用 onSayHelloStart callback
138napitest::napitest_interface::NodeISayHello::listener_.NodeISayHelloListener_onSayHelloStartCallback(info1);
139// 业务代码调用 onSayHelloEnd callback
140napitest::napitest_interface::NodeISayHello::listener_.NodeISayHelloListener_onSayHelloEndCallback(info2);
141...
142```
143
144在sayHi方法中增加register注册的回调方法的调用:
145
146```
147...
148napitest::napitest_interface::NodeISayHello *ptr = new napitest::napitest_interface::NodeISayHello();
149uint32_t callbackNum = 50;
150ptr->CallbackfuncCallback(callbackNum);
151delete ptr;
152...
153```
154
155在sayHelloWithResponse方法中增加Promise回调方法的调用:
156
157```
158...
159out.errMsg = "";
160out.response = "rec hello.";
161out.result = 0;
162...
163```
164
165在funcTest方法中增加普通函数的业务逻辑:
166
167```
168...
169if (v) {
170    out = "ret is true";
171} else {
172    out = "ret is false";
173}
174...
175```
176
177增加业务代码之后的文件如下所示:
178
179[napitest.cpp](https://gitee.com/openharmony/napi_generator/blob/master/examples/napitest.cpp)
180
181##### 增加子系统
182
183在源码/build/subsystem_config.json中增加子系统选项。如下所示:
184
185```
186"napitest": {
187    "project": "hmf/napitest",
188    "path": "foundation/napitest",
189    "name": "napitest",
190    "dir": "foundation"
191  }
192```
193
194#### 添加功能模块
195
196在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码/productdefine/common/products/rk3566.json中增加part选项,其中第一个napitest就是BUILD.gn文件中的subsystem_name,第二个napitest就是BUILD.gn文件中的part_name。
197
198    "napitest:napitest":{}
199
200#### 编译验证
201
202编译成功后,就会在 /out/产品名/packages/phone/system/lib/module/ 生成libnapitest.z.so,如下所示:
203
204    /out/ohos-arm-release/packages/phone/system/lib/module
205
206### ohos.build方式集成
207
208#### 建立模块位置
209
210模块目录理论上可在OpenHarmony工程的任一位置,假设OpenHarmony代码库的目录为OHOS_SRC,在OHOS_SRC/foundation目录下,建测试模块目录:napitest。napitest目录结构如下:
211
212    napitest
213    |-- binding.gyp
214    |-- BUILD.gn
215    |-- ohos.build
216    |-- napitest.cpp
217    |-- napitest.h
218    |-- napitest_middle.h
219    |-- napitest_middle.cpp
220    |-- test.sh
221    |-- tool_utility.cpp
222    |-- tool_utility.h
223
224其中ohos.build为新增的编译配置文件,其它为工具生成的代码。
225
226#### 编译修改点
227
228##### 修改BUILD.gn文件
229
230将deps中"//foundation/arkui/napi:ace_napi"的修改为"//foundation/ace/napi:ace_napi",修改后的BUILD.gn文件内容如下所示:
231
232```
233import("//build/ohos.gni")
234
235ohos_shared_library("napitest")
236{
237    sources = [
238        "napitest_middle.cpp",
239        "../serviceCode/NodeISayHello.cpp",     # 将业务代码编译进去
240        "napitest.cpp",
241        "tool_utility.cpp",
242    ]
243    include_dirs = [
244        ".",
245        "//third_party/node/src",
246    ]
247    deps=[
248        "//foundation/ace/napi:ace_napi",
249        "//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog",
250    ]
251    remove_configs = [ "//build/config/compiler:no_rtti" ]
252    cflags=[
253    ]
254    cflags_cc=[
255        "-frtti",
256    ]
257    ldflags = [
258    ]
259
260    relative_install_dir = "module"
261    part_name = "napitest"
262    subsystem_name = "napitest"
263}
264```
265
266若用户需要修改子系统和部件名称,则根据自身需求修改BUILD.gn文件和ohos.build文件中子系统与部件名称即可。
267
268##### 修改ohos.build文件
269
270其中module_list选项中的"//foundation/napitest"指的是napitest目录,":napitest"指的是上面BUILD.gn中的目标ohos_shared_library("napitest")。
271
272```
273{
274  "subsystem": "napitest",
275  "parts": {
276    "napitest": {
277      "module_list": [
278        "//foundation/napitest:napitest"
279      ],
280      "test_list": []
281    }
282  }
283}
284```
285
286##### 修改napitest.cpp文件
287
288为方便调试,在napitest.cpp文件中增加业务代码。以修改napitest.cpp文件为例,在以下方法中增加业务代码,
289
290在sayHello方法中增加注册的object回调方法的调用:
291
292```
293...
294// 业务代码调用 onSayHelloStart callback
295napitest::napitest_interface::NodeISayHello::listener_.NodeISayHelloListener_onSayHelloStartCallback(info1);
296// 业务代码调用 onSayHelloEnd callback
297napitest::napitest_interface::NodeISayHello::listener_.NodeISayHelloListener_onSayHelloEndCallback(info2);
298...
299```
300
301在sayHi方法中增加register注册的回调方法的调用:
302
303```
304...
305napitest::napitest_interface::NodeISayHello *ptr = new napitest::napitest_interface::NodeISayHello();
306uint32_t callbackNum = 50;
307ptr->CallbackfuncCallback(callbackNum);
308delete ptr;
309...
310```
311
312在sayHelloWithResponse方法中增加Promise回调方法的调用:
313
314```
315...
316out.errMsg = "";
317out.response = "rec hello.";
318out.result = 0;
319...
320```
321
322在funcTest方法中增加普通函数的业务逻辑:
323
324```
325...
326if (v) {
327    out = "ret is true";
328} else {
329    out = "ret is false";
330}
331...
332```
333
334增加业务代码之后的文件如下所示:
335
336[napitest.cpp](https://gitee.com/openharmony/napi_generator/blob/master/examples/napitest.cpp)
337
338##### 增加子系统
339
340在源码/build/subsystem_config.json中增加子系统选项。如下所示:
341
342```
343"napitest": {
344    "project": "hmf/napitest",
345    "path": "foundation/napitest",
346    "name": "napitest",
347    "dir": "foundation"
348  }
349```
350
351#### 添加功能模块
352
353在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码/productdefine/common/products/rk3566.json中增加part选项,其中第一个napitest就是BUILD.gn文件中的subsystem_name,第二个napitest就是BUILD.gn文件中的part_name。
354
355    "napitest:napitest":{}
356
357#### 编译验证
358
359编译成功后,就会在 /out/产品名/packages/phone/system/lib/module/ 生成libnapitest.z.so,如下所示:
360
361    /out/ohos-arm-release/packages/phone/system/lib/module
362
363