• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 手动配置业务代码后集成到OpenHarmony的方法
2
3## 场景说明
4
5为了实现工具生成的接口被其它子系统或者应用调用,需将生成的代码编译集成到OpenHarmony系统中,使其生成动态库,供OpenHarmony应用层调用。
6本文介绍如何手动配置业务代码并将生成的代码集成到OpenHarmony 4.0 Release。
7
8## 4.0 版本
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.0",
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        "ace_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#### 修改napitest.cpp文件
88
89为方便调试,在napitest.cpp文件中增加业务代码。以修改napitest.cpp文件为例,在以下方法中增加业务代码,
90
91在sayHello方法中增加注册的object回调方法的调用:
92
93```
94...
95// 业务代码调用 onSayHelloStart callback
96napitest::napitest_interface::NodeISayHello::listener_.NodeISayHelloListener_onSayHelloStartCallback(info1);
97// 业务代码调用 onSayHelloEnd callback
98napitest::napitest_interface::NodeISayHello::listener_.NodeISayHelloListener_onSayHelloEndCallback(info2);
99...
100```
101
102在sayHi方法中增加register注册的回调方法的调用:
103
104```
105...
106napitest::napitest_interface::NodeISayHello *ptr = new napitest::napitest_interface::NodeISayHello();
107uint32_t callbackNum = 50;
108ptr->CallbackfuncCallback(callbackNum);
109delete ptr;
110...
111```
112
113在sayHelloWithResponse方法中增加Promise回调方法的调用:
114
115```
116...
117out.errMsg = "";
118out.response = "rec hello.";
119out.result = 0;
120...
121```
122
123在funcTest方法中增加普通函数的业务逻辑:
124
125```
126...
127if (v) {
128    out = "ret is true";
129} else {
130    out = "ret is false";
131}
132...
133```
134
135增加业务代码之后的文件如下所示:
136
137```
138#include "napitest.h"
139#include "napitest_middle.h"
140#include "hilog/log.h"
141static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0XD002E00, "NAPITESTNAPILayer"};
142#define NAPITEST_LOGI(fmt, ...) OHOS::HiviewDFX::HiLog::Info(LABEL, \
143    	"%{public}s:%{public}d " fmt, __func__, __LINE__, ##__VA_ARGS__)
144
145namespace napitest {
146namespace napitest_interface {
147NodeISayHelloListener NodeISayHello::listener_ = {};
148bool NodeISayHello::addSayHelloListener(NodeISayHelloListener& listener)
149{
150    NodeISayHello::listener_ = listener;
151    return true;
152}
153
154bool NodeISayHello::removeSayHelloListener(NodeISayHelloListener& listener)
155{
156    return true;
157}
158
159bool NodeISayHello::registerCallbackfunc()
160{
161    return true;
162}
163
164// 供业务调用的回调接口
165void NodeISayHello::CallbackfuncCallback(NUMBER_TYPE_2& wid)
166{
167    std::string eventName = "Callbackfunc";
168    NodeISayHello_middle *ptr = new NodeISayHello_middle();
169    ptr->CallbackfuncCallbackMiddle(eventName,  wid);
170    delete ptr;
171}
172
173bool NodeISayHello::unRegisterCallbackfunc()
174{
175    return true;
176}
177
178bool NodeISayHello::sayHello(std::string& from, std::string& to, NUMBER_TYPE_9& sayType)
179{
180    NAPITEST_LOGI("NAPITEST_LOGI sayHello from = %s\r\n", from.c_str());
181    NAPITEST_LOGI("NAPITEST_LOGI sayHello to = %s\r\n", to.c_str());
182    NAPITEST_LOGI("NAPITEST_LOGI sayHello sayType = %d\r\n", sayType);
183    SayInfo info1;
184    info1.from = "js1";
185    uint32_t a = 992;
186    info1.fromId.emplace(a);
187    uint32_t b = 1014;
188    info1.toId.emplace(b);
189    info1.to = "native1";
190    info1.content = "hello1";
191    info1.saidTime = "123456789";
192    info1.isEnd = false;
193    SayInfo info2;
194    info2.from = "native";
195    uint32_t c = 101;
196    info2.fromId.emplace(c);
197    uint32_t d = 99;
198    info2.toId.emplace(d);
199    info2.to = "js";
200    info2.content = "hello";
201    info2.saidTime = "987654321";
202    info2.isEnd = true;
203    // 业务代码调用 onSayHelloStart callback
204    listener_.NodeISayHelloListener_onSayHelloStartCallback(info1);
205    // 业务代码调用 onSayHelloEnd callback
206    listener_.NodeISayHelloListener_onSayHelloEndCallback(info2);
207    return true;
208}
209
210bool NodeISayHello::sayHi(std::string& from, std::string& to, NUMBER_TYPE_10& sayType)
211{
212    NAPITEST_LOGI("NAPITEST_LOGI sayHi from = %s\r\n", from.c_str());
213    NAPITEST_LOGI("NAPITEST_LOGI sayHi to = %s\r\n", to.c_str());
214    NAPITEST_LOGI("NAPITEST_LOGI sayHi sayType = %d\r\n", sayType);
215    NodeISayHello *ptr = new NodeISayHello();
216    uint32_t callbackNum = 50;
217    ptr->CallbackfuncCallback(callbackNum);
218    delete ptr;
219    return true;
220}
221
222bool NodeISayHello::sayHelloWithResponse(std::string& from, std::string& to, NUMBER_TYPE_11& sayType,
223    uint32_t& outErrCode, AUTO_INTERFACE_5& out)
224{
225    NAPITEST_LOGI("NAPITEST_LOGI sayHelloWithResponse from = %s\r\n", from.c_str());
226    NAPITEST_LOGI("NAPITEST_LOGI sayHelloWithResponse to = %s\r\n", to.c_str());
227    NAPITEST_LOGI("NAPITEST_LOGI sayHelloWithResponse sayType = %d\r\n", sayType);
228    out.errMsg = "";
229    out.response = "rec hello.";
230    out.result = 0;
231    return true;
232}
233
234AUTO_INTERFACE_5 NodeISayHello::auto_interface_5OutRes = {};
235void NodeISayHello::auto_interface_5SetCbValue(NUMBER_TYPE_6 result, std::string errMsg, std::string response)
236{
237    NodeISayHello::auto_interface_5OutRes.result = result;
238    NodeISayHello::auto_interface_5OutRes.errMsg = errMsg;
239    NodeISayHello::auto_interface_5OutRes.response = response;
240    return;
241}
242
243bool NodeISayHelloListener::onSayHelloStart()
244{
245    return true;
246}
247
248// 供业务调用的回调接口
249void NodeISayHelloListener::NodeISayHelloListener_onSayHelloStartCallback(SayInfo& info)
250{
251    std::string eventName = "NodeISayHelloListener_onSayHelloStart";
252    NodeISayHelloListener_middle *ptr = new NodeISayHelloListener_middle();
253    ptr->NodeISayHelloListener_onSayHelloStartCallbackMiddle(eventName,  info);
254    delete ptr;
255}
256
257bool NodeISayHelloListener::onSayHelloEnd()
258{
259    return true;
260}
261
262// 供业务调用的回调接口
263void NodeISayHelloListener::NodeISayHelloListener_onSayHelloEndCallback(SayInfo& info)
264{
265    std::string eventName = "NodeISayHelloListener_onSayHelloEnd";
266    NodeISayHelloListener_middle *ptr = new NodeISayHelloListener_middle();
267    ptr->NodeISayHelloListener_onSayHelloEndCallbackMiddle(eventName,  info);
268    delete ptr;
269}
270
271bool funcTest(bool& v, std::string& out)
272{
273    if (v) {
274        out = "ret is true";
275    } else {
276        out = "ret is false";
277    }
278    return true;
279}
280}
281}
282
283```
284
285#### 增加子系统
286
287在源码/build/subsystem_config.json中增加子系统选项。如下所示:
288
289```
290"napitest": {
291    "path": "foundation/napitest",
292    "name": "napitest"
293  }
294```
295
296### 添加功能模块
297
298在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码vendor/hihope/rk3568/config.json中增加part选项,其中the first napitest就是BUILD.gn文件中的subsystem_name,第二个napitest就是BUILD.gn文件中的part_name。
299
300```
301{
302      "subsystem": "napitest",
303      "components": [
304        {
305          "component": "napitest",
306          "features": []
307        }
308      ]
309}
310```
311
312### 编译验证
313
314编译成功后,就会在 /out/产品名/packages/phone/system/lib/module/ 生成libnapitest.z.so,如下所示:
315
316    /out/rk3568/packages/phone/system/lib/module
317
318