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