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