1# NAPI框架生成工具集成测试 2 3## 简介 4 本文主要介绍如何将NAPI框架生成代码集成到OpenHarmony系统,进而进行集成测试。 5 6## 准备 7 8 1.硬件:rk3568开发套件。 9 10 2.系统镜像: 11 12 系统镜像的具体生成方法,可以左键单击以下链接了解: 13 14 [生成代码集成到OpenHarmony](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/dts2cpp/docs/usage/ENSEMBLE_METHOD_ZH.md) 15 16 3.应用hap包:hap包及源码路径如下: 17 18``` 19napi_generator/examples/app 20``` 21 22 hap包的具体生成方法,可参考OpenHarmony/docs/zh-cn/application-dev文档中使用ArkTS语言开发(Stage模型)。 23### 修改点1:扩展SDK接口 241. 查看SDK目录:打开DevEco Studio ,点击 Tools -> SDK Manager -> SDK 25 26  27 282. 将@ohos.napitest.d.ts文件拷贝到应用所使用的sdk目录下 的ets\api 29 30  31 32### 修改点2:增加新接口调用 33其中修改index.ets文件内容如下: 34 35``` 36import napitest from '@ohos.napitest'; 37 38let ns: napitest.NodeISayHello = new napitest.NodeISayHello(); 39class NodeISayHelloListenerImpl { 40 onSayHelloStart(info: object) { 41 AppStorage.SetOrCreate("textInfoStart", JSON.stringify(info)) 42 console.log('napiTestDemo ----onSayHelloStart', JSON.stringify(info)); 43 } 44 onSayHelloEnd(info: object) { 45 AppStorage.SetOrCreate("textInfoEnd", JSON.stringify(info)) 46 console.log('napiTestDemo ----onSayHelloEnd.', JSON.stringify(info)); 47 } 48} 49 50let listener: NodeISayHelloListenerImpl = new NodeISayHelloListenerImpl() 51 52// register注册的回调 53function onCallbackfunnm(wid: number) { 54 AppStorage.SetOrCreate("callBackNum", JSON.stringify(wid)) 55 console.info("napiTestDemo ----onCallbackfunnm wid = " + wid) 56 return "ocCallbackfuncnm"; 57} 58 59@Entry 60@Component 61struct Index { 62 @State promiseRes: string = '' 63 @State returnVal: string = '' 64 @StorageLink("textInfoStart")textInfoStart: string = "" 65 @StorageLink("textInfoEnd")textInfoEnd: string = "" 66 @StorageLink("callBackNum")callBackNum: string = "" 67 68 build() { 69 Row() { 70 Column() { 71 Button() { 72 Text('注册object回调后SayHello调用回调') 73 .fontSize(20) 74 .fontWeight(FontWeight.Bold) 75 } 76 .type(ButtonType.Capsule) 77 .margin({ 78 top: 10 79 }) 80 .backgroundColor('#0D9FFB') 81 .width('90%') 82 .height('5%') 83 .onClick(() => { 84 AppStorage.SetOrCreate("textInfoStart", "") 85 AppStorage.SetOrCreate("textInfoEnd", "") 86 // 注册回调 87 ns.addSayHelloListener(listener); 88 // 调用回调 89 ns.sayHello("js1", "native1", napitest.SayType.kInitiative); 90 }) 91 92 Button() { 93 Text('注销object回调后SayHello调用回调') 94 .fontSize(20) 95 .fontWeight(FontWeight.Bold) 96 } 97 .type(ButtonType.Capsule) 98 .margin({ 99 top: 10 100 }) 101 .backgroundColor('#0D9FFB') 102 .width('90%') 103 .height('5%') 104 .onClick(() => { 105 AppStorage.SetOrCreate("textInfoStart", "") 106 AppStorage.SetOrCreate("textInfoEnd", "") 107 // 注销回调 removeSayHelloListener 108 ns.removeSayHelloListener(listener); 109 // 调用回调 110 ns.sayHello("js2", "native2", napitest.SayType.kInitiative); 111 }) 112 113 // promise回调 114 Button() { 115 Text('Promise 回调') 116 .fontSize(20) 117 .fontWeight(FontWeight.Bold) 118 } 119 .type(ButtonType.Capsule) 120 .margin({ 121 top: 10 122 }) 123 .backgroundColor('#0D9FFB') 124 .width('90%') 125 .height('5%') 126 .onClick(async () => { 127 await ns.sayHelloWithResponse("response from", "response to", napitest.SayType.kResponse).then((ret: object) => { 128 this.promiseRes = JSON.stringify(ret); 129 console.info("napiTestDemo ----sayHelloWithResponse ret = " + JSON.stringify(ret)); 130 }); 131 }) 132 133 Button() { 134 Text('register回调后sayHi调用回调') 135 .fontSize(20) 136 .fontWeight(FontWeight.Bold) 137 } 138 .type(ButtonType.Capsule) 139 .margin({ 140 top: 10 141 }) 142 .backgroundColor('#0D9FFB') 143 .width('90%') 144 .height('5%') 145 .onClick( () => { 146 AppStorage.SetOrCreate("callBackNum", "") 147 // 注册回调 148 ns.registerCallbackfunc(onCallbackfunnm); 149 // 调用回调 150 ns.sayHi("js3", "native3", napitest.SayType.kResponse); 151 }) 152 153 Button() { 154 Text('unRegister回调后sayHi调用回调') 155 .fontSize(20) 156 .fontWeight(FontWeight.Bold) 157 } 158 .type(ButtonType.Capsule) 159 .margin({ 160 top: 10 161 }) 162 .backgroundColor('#0D9FFB') 163 .width('90%') 164 .height('5%') 165 .onClick( () => { 166 AppStorage.SetOrCreate("callBackNum", "") 167 // 注销回调 168 ns.unRegisterCallbackfunc(onCallbackfunnm); 169 // 调用回调 170 ns.sayHi("js4", "native4", napitest.SayType.kResponse); 171 }) 172 173 // 调用普通函数 174 Button() { 175 Text('调用funcTest方法') 176 .fontSize(20) 177 .fontWeight(FontWeight.Bold) 178 } 179 .type(ButtonType.Capsule) 180 .margin({ 181 top: 10 182 }) 183 .backgroundColor('#0D9FFB') 184 .width('90%') 185 .height('5%') 186 .onClick( () => { 187 this.returnVal = napitest.funcTest(false); 188 console.info("napiTestDemo ----funcTest returnVal = " + this.returnVal) 189 }) 190 191 Text('promise回调: promiseResult = ' + this.promiseRes).margin({ top: 10 }) 192 Text('sayHelloStart回调: info = ' + this.textInfoStart).margin({ top: 10 }) 193 Text('sayHelloEnd回调: info = ' + this.textInfoEnd).margin({ top: 10 }) 194 Text('register注册的回调: wid = ' + this.callBackNum).margin({ top: 10 }) 195 Text('普通方法funcTest返回值: returnVal = ' + this.returnVal).margin({ top: 10 }) 196 } 197 .width('100%') 198 } 199 .height('100%') 200 } 201} 202 203``` 204 205关键代码说明: 206 2071.定义回调: 208 2091.1 定义object回调 210 211``` 212class NodeISayHelloListenerImpl { 213 onSayHelloStart(info: object) { 214 console.log('napiTestDemo ----onSayHelloStart', info); 215 AppStorage.SetOrCreate("textInfoStart", JSON.stringify(info)) 216 } 217 onSayHelloEnd(info: object) { 218 console.log('napiTestDemo ----onSayHelloEnd.', info); 219 AppStorage.SetOrCreate("textInfoEnd", JSON.stringify(info)) 220 } 221} 222let listener: NodeISayHelloListenerImpl = new NodeISayHelloListenerImpl() 223``` 224 2251.2 定义register注册的回调 226 227``` 228function onCallbackfunnm(wid: number) { 229 AppStorage.SetOrCreate("callBackNum", JSON.stringify(wid)) 230 console.info("wid = " + wid) 231 return "ocCallbackfuncnm"; 232} 233``` 234 2352.注册回调: 236 2372.1 addXXX注册object回调 238 239``` 240ns.addSayHelloListener(listener); 241``` 242 2432.2 registerXXX注册回调 244 245``` 246ns.registerCallbackfunc(onCallbackfunnm); 247``` 248 2493.调用回调: 250 2513.1 调用sayHello普通函数,该函数业务实现会调用注册的object回调 252 253``` 254ns.sayHello("js1", "native1", napitest.SayType.kInitiative); 255``` 256 257调用成功后,打印传入的参数 258 259``` 260I C02e00/NAPITESTNAPILayer: [NodeISayHello.cpp:37] NAPITEST_LOGI sayHello from = js1 261I C02e00/NAPITESTNAPILayer: [NodeISayHello.cpp:38] NAPITEST_LOGI sayHello to = native1 262I C02e00/NAPITESTNAPILayer: [NodeISayHello.cpp:39] NAPITEST_LOGI sayHello sayType = 0 263``` 264 265js层打印回调数据 266 267``` 268A03d00/JSAPP: napiTestDemo ----onSayHelloStart {"from":"js1","fromId":992,"to":"native1","toId":1014,"content":"hello1","saidTime":"123456789","isEnd":false} 269... 270A03d00/JSAPP: napiTestDemo ----onSayHelloEnd. {"from":"native","fromId":101,"to":"js","toId":99,"content":"hello","saidTime":"987654321","isEnd":true} 271``` 272 2733.2 调用sayHi普通函数,该函数业务实现会调用register注册的object回调 274 275``` 276ns.sayHi("js3", "native3", napitest.SayType.kResponse); 277``` 278 279调用成功后,打印传入的参数 280 281``` 282I C02e00/NAPITESTNAPILayer: sayHi:81 NAPITEST_LOGI sayHi from = js3 283I C02e00/NAPITESTNAPILayer: sayHi:82 NAPITEST_LOGI sayHi to = native3 284I C02e00/NAPITESTNAPILayer: sayHi:83 NAPITEST_LOGI sayHi sayType = 1 285``` 286 287js层打印回到数据 288 289``` 290I A03d00/JSAPP: napiTestDemo ----onCallbackfunnm wid = 50 291``` 292 2934.注销回调: 294 2954.1 removeXXX注销object回调 296 297``` 298ns.removeSayHelloListener(listener); 299``` 300 301注销回调后再次调用sayHello方法,js层将无法再打印出回调数据 302 303``` 304ns.sayHello("js2", "native2", napitest.SayType.kInitiative); 305``` 306 3074.2 unRegisterXXX注销回调 308 309``` 310ns.unRegisterCallbackfunc(onCallbackfunnm); 311``` 312 313注销回调后再次调用sayHi方法,js层将无法再打印出回调数据 314 315``` 316ns.sayHi("js4", "native4", napitest.SayType.kResponse); 317``` 318 3195.调用Promise回调 320 321``` 322 await ns.sayHelloWithResponse("response from", "response to", napitest.SayType.kResponse).then((ret: object) => { 323 this.promiseRes = JSON.stringify(ret); 324 console.info("napiTestDemo ----sayHelloWithResponse ret = " + JSON.stringify(ret)); 325 }); 326``` 327 328调用成功后,打印传入的参数 329 330``` 331I C02e00/NAPITESTNAPILayer: sayHelloWithResponse:107 NAPITEST_LOGI sayHelloWithResponse from = response from 332I C02e00/NAPITESTNAPILayer: sayHelloWithResponse:108 NAPITEST_LOGI sayHelloWithResponse to = response to 333I C02e00/NAPITESTNAPILayer: sayHelloWithResponse:109 NAPITEST_LOGI sayHelloWithResponse sayType = 1 334``` 335 336js层打印promise回调数据 337 338``` 339I A03d00/JSAPP: napiTestDemo ----sayHelloWithResponse ret = {"result":0,"errMsg":"","response":""} 340``` 341 3426.调用普通方法funcTest 343 344``` 345this.returnVal = napitest.funcTest(false); 346console.info("napiTestDemo ----funcTest returnVal = " + this.returnVal) 347``` 348 349调用成功后,在js层打印返回值 350 351``` 352I A03d00/JSAPP: napiTestDemo ----funcTest returnVal = "ret is false" 353``` 354 3557.Text打印数据说明 356 357 358``` 359// 调用sayHelloWithResponse后保存promise回调数据 360Text('promise回调: promiseResult = ' + this.promiseRes).margin({ top: 10 }) 361// 调用sayHello方法后保留addXXX注册的回调方法数据 362Text('sayHelloStart回调: info = ' + this.textInfoStart).margin({ top: 10 }) 363Text('sayHelloEnd回调: info = ' + this.textInfoEnd).margin({ top: 10 }) 364// 调用sayHi方法后保留registerXXX注册的回调方法数据 365Text('register注册的回调: wid = ' + this.callBackNum).margin({ top: 10 }) 366// 调用fucnTest方法后保存返回值 367Text('普通方法funcTest返回值: returnVal = ' + this.returnVal).margin({ top: 10 }) 368``` 369 370## 使用说明 371 372步骤一:安装镜像环境:将out/rk3568/packages/phone目录下的images镜像文件下载并烧录到开发板上。 373 374 OpenHarmony@Ubuntu-64:~/OpenHarmony/out/rk3568/packages/phone/images$ ll 375 total 767452 376 drwxrwxrwx 2 root root 4096 Nov 21 05:32 ./ 377 drwxrwxrwx 15 root root 4096 Nov 21 05:32 ../ 378 -rwxrwxrwx 1 root root 67108864 Nov 21 05:04 boot_linux.img* 379 -rw-r--r-- 1 root root 52428800 Nov 21 05:32 chip_prod.img 380 -rwxrwxrwx 1 root root 8569 Nov 21 05:04 config.cfg* 381 -rw-r--r-- 1 root root 12582912 Nov 21 05:32 eng_system.img 382 -rwxrwxrwx 1 root root 455104 Nov 21 05:04 MiniLoaderAll.bin* 383 -rwxrwxrwx 1 root root 756 Nov 21 05:04 parameter.txt* 384 -rw-rw-r-- 1 root root 2507625 Nov 21 05:32 ramdisk.img 385 -rwxrwxrwx 1 root root 5639680 Nov 21 05:04 resource.img* 386 -rw-r--r-- 1 root root 52428800 Nov 21 05:32 sys_prod.img 387 -rw-r--r-- 1 root root 1610608640 Nov 21 05:32 system.img 388 -rwxrwxrwx 1 root root 4194304 Nov 21 05:04 uboot.img* 389 -rw-rw-r-- 1 root root 15806303 Nov 21 05:32 updater.img 390 -rw-r--r-- 1 root root 1468006400 Nov 21 05:32 userdata.img 391 -rw-r--r-- 1 root root 268431360 Nov 21 05:32 vendor.img 392 393步骤二:安装hap包。 394 395 Build Haps通过后,通过Run按钮将hap包安装到板子上。 396 397 执行完成后,设备中会出现安装的APP。 398 399步骤三:打印日志并验证结果。 400 401 hap包安装成功后,进入hdc shell 402 403 首先执行以下命令关闭hilog隐私权限 404 405``` 406hilog -p off 407``` 408 409 输入命令实时打印日志并输出至windows中。 410 411 .\hdc.exe hilog > log.txt 412 413 然后单击设备中安装的APP,进入APP后单击测试按钮,执行完成后会在hdc安装目录下出现log.txt文件。 414 415## 查看结果 416 417 log.txt中包含"NAPITEST_LOGI..."相关日志即为接口调用成功,如: 418 419``` 420I C02e00/NAPITESTNAPILayer: [NodeISayHello.cpp:37] NAPITEST_LOGI sayHello from = js1 421I C02e00/NAPITESTNAPILayer: [NodeISayHello.cpp:38] NAPITEST_LOGI sayHello to = native1 422I C02e00/NAPITESTNAPILayer: [NodeISayHello.cpp:39] NAPITEST_LOGI sayHello sayType = 0 423I C02e00/NAPITESTNAPILayer: [NodeISayHello.cpp:64] NAPITEST_LOGI NodeISayHelloListener_onSayHelloStartCallback begin 424I C02e00/NAPITESTNAPILayer: [NodeISayHello.cpp:66] NAPITEST_LOGI NodeISayHelloListener_onSayHelloStartCallback end 425... 426``` 427 428点击“注册object回调后SayHello调用回调”按钮,sayHelloStart回调info和sayHelloEnd回调info会显示出C++传到js层的回调数据; 429 430点击“注销object回调后SayHello调用回调”按钮,sayHelloStart回调info和sayHelloEnd回调info会显示出数据为空,即该回调已注销,C++无法调用回调,显示的为应用赋的空值; 431 432点击“Promise 回调”按钮,Promise回调的errMsg, result, response会出现C++传到js层的回调数据; 433 434点击“register回调后SayHi调用回调”按钮,register注册的回调会显示出wid = 50, wid值为C++传到js的回调数据; 435 436点击“unRegister回调后SayHi调用回调”按钮,register注册的回调会显示出wid 为空,即该回调已注销,C++无法调用回调,显示的为应用赋的空值; 437 438点击”调用funcTest方法“按钮,普通方法funcTest返回值显示出 returnVal = ret is false。 439 440## 相关仓 441 442暂无 443