• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# NAPI框架生成代码集成到OpenHarmony的方法
2
3## 场景说明
4
5为了实现工具生成的接口被其它子系统或者应用调用,需将生成的代码编译集成到OpenHarmony系统中,使其生成动态库,供OpenHarmony应用层调用。
6本文介绍如何将工具生成的源码利用OpenHarmony编译系统生成动态库供应用层调用,主要是有以下两种方式,分别为增加ohos.build文件方式和增加bundle.json文件方式。
7
8## 4.1版本
9
10### 建立模块位置
11
12模块目录理论上可在OpenHarmony工程的任一位置,假设OpenHarmony代码库的目录为OHOS_SRC,在OHOS_SRC/foundation目录下,建测试模块目录:napitest。napitest目录结构如下:
13
14    napitest
15    |-- binding.gyp
16    |-- BUILD.gn
17    |-- bundle.json
18    |-- napitest.cpp
19    |-- napitest.h
20    |-- napitest_middle.h
21    |-- napitest_middle.cpp
22    |-- test.sh
23    |-- tool_utility.cpp
24    |-- tool_utility.h
25
26其中bundle.json为新增的编译配置文件,其它为工具生成的代码。
27
28### 编译修改点
29
30#### 修改bundle.json文件
31
32其中destPath选项中的"//foundation/napitest"指的是napitest目录,":napitest"指的是上面BUILD.gn中的目标ohos_shared_library("napitest")。
33
34```
35{
36  "name": "@ohos/napitest",
37  "description": "napitest provides atomic capabilities",
38  "version": "4.1",
39  "license": "Apache License 2.0",
40  "publishAs": "code-segment",
41  "segment": {
42    "destPath": "foundation/napitest"
43  },
44  "dirs": {},
45  "scripts": {},
46  "component": {
47    "name": "napitest",
48    "subsystem": "napitest",
49    "features": [],
50    "adapted_system_type": [
51      "standard"
52    ],
53    "rom": "10000KB",
54    "ram": "10000KB",
55    "deps": {
56      "components": [
57        "napi",
58        "ipc_core",
59        "libhilog"
60      ],
61      "third_party": [
62        "node"
63      ]
64    },
65    "build": {
66      "sub_component": [
67        "//foundation/napitest:napitest"
68      ],
69      "inner_kits": [
70        {
71          "header": {
72            "header_base": "//foundation/napitest",
73            "header_files": [
74              "tool_utility.h",
75              "napitest.h",
76              "napitest_middle.h"
77            ]
78          },
79          "name": "//foundation/napitest:napitest"
80        }
81      ]
82    }
83  }
84}
85```
86
87#### 修改BUILD.gn文件
88
89删除ohos_shared_library("napitest")中的deps,并新增external_deps = [ "napi:ace_napi" ] 修改后的BUILD.gn文件内容如下所示:
90
91```
92import("//build/ohos.gni")
93
94ohos_shared_library("napitest")
95{
96    sources = [
97        "napitest_middle.cpp",
98        "napitest.cpp",
99        "tool_utility.cpp",
100    ]
101    include_dirs = [
102        ".",
103        "//third_party/node/src",
104    ]
105    external_deps = [ "napi:ace_napi" ]
106    remove_configs = [ "//build/config/compiler:no_rtti" ]
107    cflags=[
108    ]
109    cflags_cc=[
110        "-frtti",
111    ]
112    ldflags = [
113    ]
114
115    relative_install_dir = "module"
116    part_name = "napitest"
117    subsystem_name = "napitest"
118}
119```
120
121#### 修改napitest.cpp文件
122
123在funcTest方法中增加业务逻辑:
124
125```
126out = v1 + v2;
127```
128
129#### 增加子系统
130
131在源码/build/subsystem_config.json中增加子系统选项。如下所示:
132
133```
134"napitest": {
135    "path": "foundation/napitest",
136    "name": "napitest"
137  }
138```
139
140### 添加功能模块
141
142在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码vendor/hihope/rk3568/config.json中增加part选项,其中the first napitest就是BUILD.gn文件中的subsystem_name,第二个napitest就是BUILD.gn文件中的part_name。
143
144```
145{
146      "subsystem": "napitest",
147      "components": [
148        {
149          "component": "napitest",
150          "features": []
151        }
152      ]
153}
154```
155
156### 编译验证
157
158编译成功后,就会在 /out/产品名/packages/phone/system/lib/module/ 生成libnapitest.z.so,如下所示:
159
160    /out/rk3568/packages/phone/system/lib/module
161
162## 4.0 版本
163
164### 建立模块位置
165
166模块目录理论上可在OpenHarmony工程的任一位置,假设OpenHarmony代码库的目录为OHOS_SRC,在OHOS_SRC/foundation目录下,建测试模块目录:napitest。napitest目录结构如下:
167
168    napitest
169    |-- binding.gyp
170    |-- BUILD.gn
171    |-- bundle.json
172    |-- napitest.cpp
173    |-- napitest.h
174    |-- napitest_middle.h
175    |-- napitest_middle.cpp
176    |-- test.sh
177    |-- tool_utility.cpp
178    |-- tool_utility.h
179
180其中bundle.json为新增的编译配置文件,其它为工具生成的代码。
181
182### 编译修改点
183
184#### 修改bundle.json文件
185
186其中destPath选项中的"//foundation/napitest"指的是napitest目录,":napitest"指的是上面BUILD.gn中的目标ohos_shared_library("napitest")。
187
188```
189{
190  "name": "@ohos/napitest",
191  "description": "napitest provides atomic capabilities",
192  "version": "4.0",
193  "license": "Apache License 2.0",
194  "publishAs": "code-segment",
195  "segment": {
196    "destPath": "foundation/napitest"
197  },
198  "dirs": {},
199  "scripts": {},
200  "component": {
201    "name": "napitest",
202    "subsystem": "napitest",
203    "features": [],
204    "adapted_system_type": [
205      "standard"
206    ],
207    "rom": "10000KB",
208    "ram": "10000KB",
209    "deps": {
210      "components": [
211        "ace_napi",
212        "ipc_core",
213        "libhilog"
214      ],
215      "third_party": [
216        "node"
217      ]
218    },
219    "build": {
220      "sub_component": [
221        "//foundation/napitest:napitest"
222      ],
223      "inner_kits": [
224        {
225          "header": {
226            "header_base": "//foundation/napitest",
227            "header_files": [
228              "tool_utility.h",
229              "napitest.h",
230              "napitest_middle.h"
231            ]
232          },
233          "name": "//foundation/napitest:napitest"
234        }
235      ]
236    }
237  }
238}
239```
240
241#### 修改napitest.cpp文件
242
243在funcTest方法中增加业务逻辑:
244
245```
246out = v1 + v2;
247```
248
249#### 增加子系统
250
251在源码/build/subsystem_config.json中增加子系统选项。如下所示:
252
253```
254"napitest": {
255    "path": "foundation/napitest",
256    "name": "napitest"
257  }
258```
259
260### 添加功能模块
261
262在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码vendor/hihope/rk3568/config.json中增加part选项,其中the first napitest就是BUILD.gn文件中的subsystem_name,第二个napitest就是BUILD.gn文件中的part_name。
263
264```
265{
266      "subsystem": "napitest",
267      "components": [
268        {
269          "component": "napitest",
270          "features": []
271        }
272      ]
273}
274```
275
276### 编译验证
277
278编译成功后,就会在 /out/产品名/packages/phone/system/lib/module/ 生成libnapitest.z.so,如下所示:
279
280    /out/rk3568/packages/phone/system/lib/module
281
282## 3.2 版本
283
284### 建立模块位置
285
286模块目录理论上可在OpenHarmony工程的任一位置,假设OpenHarmony代码库的目录为OHOS_SRC,在OHOS_SRC/foundation目录下,建测试模块目录:napitest。napitest目录结构如下:
287
288    napitest
289    |-- binding.gyp
290    |-- BUILD.gn
291    |-- bundle.json
292    |-- napitest.cpp
293    |-- napitest.h
294    |-- napitest_middle.h
295    |-- napitest_middle.cpp
296    |-- test.sh
297    |-- tool_utility.cpp
298    |-- tool_utility.h
299
300其中bundle.json为新建的编译配置文件,其它为工具生成的代码。
301
302### 编译修改点
303
304#### 修改bundle.json文件
305
306其中destPath选项中的"//foundation/napitest"指的是napitest目录,":napitest"指的是上面BUILD.gn中的目标ohos_shared_library("napitest")。
307
308```
309{
310  "name": "@ohos/napitest",
311  "description": "napitest provides atomic capabilities",
312  "version": "3.2",
313  "license": "Apache License 2.0",
314  "publishAs": "code-segment",
315  "segment": {
316    "destPath": "foundation/napitest"
317  },
318  "dirs": {},
319  "scripts": {},
320  "component": {
321    "name": "napitest",
322    "subsystem": "napitest",
323    "features": [],
324    "adapted_system_type": [
325      "standard"
326    ],
327    "rom": "10000KB",
328    "ram": "10000KB",
329    "deps": {
330      "components": [
331        "ace_napi",
332        "ipc_core",
333        "libhilog"
334      ],
335      "third_party": [
336        "node"
337      ]
338    },
339    "build": {
340      "sub_component": [
341        "//foundation/napitest:napitest"
342      ],
343      "inner_kits": [
344        {
345          "header": {
346            "header_base": "//foundation/napitest",
347            "header_files": [
348              "tool_utility.h",
349              "napitest.h",
350              "napitest_middle.h"
351            ]
352          },
353          "name": "//foundation/napitest:napitest"
354        }
355      ]
356    }
357  }
358}
359```
360
361#### 修改napitest.cpp文件
362
363在funcTest方法中增加业务逻辑:
364
365```
366out = v1 + v2;
367```
368
369#### 增加子系统
370
371在源码/build/subsystem_config.json中增加子系统选项。如下所示:
372
373```
374"napitest": {
375    "path": "foundation/napitest",
376    "name": "napitest"
377  }
378```
379
380### 添加功能模块
381
382在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码vendor/hihope/rk3568/config.json中增加part选项,其中the first napitest就是BUILD.gn文件中的subsystem_name,第二个napitest就是BUILD.gn文件中的part_name。
383
384```
385{
386      "subsystem": "napitest",
387      "components": [
388        {
389          "component": "napitest",
390          "features": []
391        }
392      ]
393}
394```
395
396### 编译验证
397
398编译成功后,就会在 /out/产品名/packages/phone/system/lib/module/ 生成libnapitest.z.so,如下所示:
399
400    /out/rk3568/packages/phone/system/lib/module
401
402## 3.1 版本
403
404### bundle.json方式集成
405
406#### 建立模块位置
407
408模块目录理论上可在OpenHarmony工程的任一位置,假设OpenHarmony代码库的目录为OHOS_SRC,在OHOS_SRC/foundation目录下,建测试模块目录:napitest。napitest目录结构如下:
409
410    napitest
411    |-- binding.gyp
412    |-- BUILD.gn
413    |-- bundle.json
414    |-- napitest.cpp
415    |-- napitest.h
416    |-- napitest_middle.h
417    |-- napitest_middle.cpp
418    |-- test.sh
419    |-- tool_utility.cpp
420    |-- tool_utility.h
421
422其中bundle.json为新增的编译配置文件,其它为工具生成的代码。
423
424#### 编译修改点
425
426##### 修改BUILD.gn文件
427
428将deps中"//foundation/arkui/napi:ace_napi"的修改为"//foundation/ace/napi:ace_napi",修改后的BUILD.gn文件内容如下所示:
429
430```
431import("//build/ohos.gni")
432
433ohos_shared_library("napitest")
434{
435    sources = [
436        "napitest_middle.cpp",
437        "../serviceCode/NodeISayHello.cpp",     # 将业务代码编译进去
438        "napitest.cpp",
439        "tool_utility.cpp",
440    ]
441    include_dirs = [
442        ".",
443        "//third_party/node/src",
444    ]
445    deps=[
446        "//foundation/ace/napi:ace_napi",
447        "//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog",
448    ]
449    remove_configs = [ "//build/config/compiler:no_rtti" ]
450    cflags=[
451    ]
452    cflags_cc=[
453        "-frtti",
454    ]
455    ldflags = [
456    ]
457
458    relative_install_dir = "module"
459    part_name = "napitest"
460    subsystem_name = "napitest"
461}
462```
463
464若用户需要修改子系统和部件名称,则根据自身需求修改BUILD.gn文件和bundle.json文件中子系统与部件名称即可。
465
466##### 修改bundle.json文件
467
468其中destPath选项中的"//foundation/napitest"指的是napitest目录,":napitest"指的是上面BUILD.gn中的目标ohos_shared_library("napitest")。
469
470```
471{
472  "name": "@ohos/napitest",
473  "description": "napitest provides atomic capabilities",
474  "version": "3.1",
475  "license": "Apache License 2.0",
476  "publishAs": "code-segment",
477  "segment": {
478    "destPath": "foundation/napitest"
479  },
480  "dirs": {},
481  "scripts": {},
482  "component": {
483    "name": "napitest",
484    "subsystem": "napitest",
485    "features": [],
486    "adapted_system_type": [
487      "standard"
488    ],
489    "rom": "10000KB",
490    "ram": "10000KB",
491    "deps": {
492      "components": [
493        "ace_napi",
494        "ipc_core",
495        "libhilog"
496      ],
497      "third_party": [
498        "node"
499      ]
500    },
501    "build": {
502      "sub_component": [
503        "//foundation/napitest:napitest"
504      ],
505      "inner_kits": [
506        {
507          "header": {
508            "header_base": "//foundation/napitest",
509            "header_files": [
510              "tool_utility.h",
511              "napitest.h",
512              "napitest_middle.h"
513            ]
514          },
515          "name": "//foundation/napitest:napitest"
516        }
517      ]
518    }
519  }
520}
521```
522
523##### 修改napitest.cpp文件
524
525在funcTest方法中增加业务逻辑:
526
527```
528out = v1 + v2;
529```
530
531##### 增加子系统
532
533在源码/build/subsystem_config.json中增加子系统选项。如下所示:
534
535```
536"napitest": {
537    "project": "hmf/napitest",
538    "path": "foundation/napitest",
539    "name": "napitest",
540    "dir": "foundation"
541  }
542```
543
544#### 添加功能模块
545
546在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码/productdefine/common/products/rk3566.json中增加part选项,其中the first napitest就是BUILD.gn文件中的subsystem_name,第二个napitest就是BUILD.gn文件中的part_name。
547
548    "napitest:napitest":{}
549
550#### 编译验证
551
552编译成功后,就会在 /out/产品名/packages/phone/system/lib/module/ 生成libnapitest.z.so,如下所示:
553
554    /out/ohos-arm-release/packages/phone/system/lib/module
555
556### ohos.build方式集成
557
558#### 建立模块位置
559
560模块目录理论上可在OpenHarmony工程的任一位置,假设OpenHarmony代码库的目录为OHOS_SRC,在OHOS_SRC/foundation目录下,建测试模块目录:napitest。napitest目录结构如下:
561
562    napitest
563    |-- binding.gyp
564    |-- BUILD.gn
565    |-- ohos.build
566    |-- napitest.cpp
567    |-- napitest.h
568    |-- napitest_middle.h
569    |-- napitest_middle.cpp
570    |-- test.sh
571    |-- tool_utility.cpp
572    |-- tool_utility.h
573
574其中ohos.build为新增的编译配置文件,其它为工具生成的代码。
575
576#### 编译修改点
577
578##### 修改BUILD.gn文件
579
580将deps中"//foundation/arkui/napi:ace_napi"的修改为"//foundation/ace/napi:ace_napi",修改后的BUILD.gn文件内容如下所示:
581
582```
583import("//build/ohos.gni")
584
585ohos_shared_library("napitest")
586{
587    sources = [
588        "napitest_middle.cpp",
589        "../serviceCode/NodeISayHello.cpp",     # 将业务代码编译进去
590        "napitest.cpp",
591        "tool_utility.cpp",
592    ]
593    include_dirs = [
594        ".",
595        "//third_party/node/src",
596    ]
597    deps=[
598        "//foundation/ace/napi:ace_napi",
599        "//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog",
600    ]
601    remove_configs = [ "//build/config/compiler:no_rtti" ]
602    cflags=[
603    ]
604    cflags_cc=[
605        "-frtti",
606    ]
607    ldflags = [
608    ]
609
610    relative_install_dir = "module"
611    part_name = "napitest"
612    subsystem_name = "napitest"
613}
614```
615
616若用户需要修改子系统和部件名称,则根据自身需求修改BUILD.gn文件和ohos.build文件中子系统与部件名称即可。
617
618##### 修改ohos.build文件
619
620其中module_list选项中的"//foundation/napitest"指的是napitest目录,":napitest"指的是上面BUILD.gn中的目标ohos_shared_library("napitest")。
621
622```
623{
624  "subsystem": "napitest",
625  "parts": {
626    "napitest": {
627      "module_list": [
628        "//foundation/napitest:napitest"
629      ],
630      "test_list": []
631    }
632  }
633}
634```
635
636##### 修改napitest.cpp文件
637
638在funcTest方法中增加业务逻辑:
639
640```
641out = v1 + v2;
642```
643
644##### 增加子系统
645
646在源码/build/subsystem_config.json中增加子系统选项。如下所示:
647
648```
649"napitest": {
650    "project": "hmf/napitest",
651    "path": "foundation/napitest",
652    "name": "napitest",
653    "dir": "foundation"
654  }
655```
656
657#### 添加功能模块
658
659在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码/productdefine/common/products/rk3566.json中增加part选项,其中the first napitest就是BUILD.gn文件中的subsystem_name,第二个napitest就是BUILD.gn文件中的part_name。
660
661    "napitest:napitest":{}
662
663#### 编译验证
664
665编译成功后,就会在 /out/产品名/packages/phone/system/lib/module/ 生成libnapitest.z.so,如下所示:
666
667    /out/ohos-arm-release/packages/phone/system/lib/module
668
669## 总结
670
6713.1版本两种集成方式使用场景说明:
672
673ohos.build方式集成:适合3.0前版本使用。
674
675bundle.json方式集成:兼容ohos.build方式,但3.1及以后版本建议使用此种方式集成。
676
6773.2版本适合使用bundle.json方式集成。
678
6794.0版本适合使用bundle.json方式集成。
680
6814.1版本适合使用bundle.json方式集成。
682
683