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