• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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   ![](../figures/DevEco_SDK_path.png)
27
282. 将@ohos.napitest.d.ts文件拷贝到应用所使用的sdk目录下 的ets\api
29
30   ![](../figures/DevEco_add_interface.png)
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