1# NAPI框架生成代码集成到OpenHarmony的方法 2 3## 场景说明 4 5为了实现工具生成的接口被其他子系统或者应用调用,需将生成的代码编译集成到OpenHarmony系统中,使其生成动态库,供OpenHarmony应用层调用。 6本文介绍如何将工具生成的源码利用OpenHarmony编译系统生成动态库供应用层调用,主要是有以下两种方式,分别为增加ohos.build文件方式和增加bundle.json文件方式。 7 8## ohos.build方式集成 9### 建立模块位置 10 11模块目录理论上可以建立在OpenHarmony代码库的任何地方,假设OpenHarmony代码库的目录为`OHOS_SRC`,在`OHOS_SRC/foundation`目录下,例如建立此次测试模块目录:napitest。此时,`OHOS_SRC/foundation`目录下应该有aafwk,ace,ai, …, napitest等目录,其中napitest就是刚刚建立的,在napitest目录下,把之前用可执行文件或者插件转换出来的文件全部拷贝到该目录下,并且在该目录下新建一个文件ohos.build。例如napitest目录下有以下文件: 12 13 foundation/napitest 14 |-- binding.gyp 15 |-- BUILD.gn 16 |-- ohos.build 17 |-- napitest.cpp 18 |-- napitest.h 19 |-- napitest_middle.cpp 20 |-- test.sh 21 |-- tool_utility.cpp 22 |-- tool_utility.h 23 24### 编译修改点 25 26#### 修改build.gn文件 27 28``` 29 import("//build/ohos.gni") 30 31 ohos_shared_library("napitest") 32 { 33 # 指定编译源文件 34 sources = [ 35 "napitest_middle.cpp", 36 "napitest.cpp", 37 "tool_utility.cpp", 38 ] 39 include_dirs = [ 40 ".", 41 "//third_party/node/src", 42 ] 43 # 指定编译依赖,如果依赖第三方库,需要在此添加 44 deps=[ 45 "//foundation/ace/napi:ace_napi", 46 "//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog", 47 ] 48 remove_configs = [ "//build/config/compiler:no_rtti" ] 49 cflags=[ 50 ] 51 cflags_cc=[ 52 "-frtti", 53 ] 54 ldflags = [ 55 ] 56 # 指定库生成的路径 57 relative_install_dir = "module" 58 # 主要是修改下面两条内容,子系统及其组件,后面会引用 59 part_name = "napitest_interface" 60 subsystem_name = "napitest" 61 } 62``` 63 64#### 修改ohos.build文件 65其中module_list选项中的"//foundation/napitest"指的是napitest目录,":napitest"指的是上面BUILD.gn中的目标ohos_shared_library("napitest")。 66 67``` 68{ 69 "subsystem": "napitest", 70 "parts": { 71 "napitest_interface": { 72 "module_list": [ 73 "//foundation/napitest:napitest" 74 ], 75 "test_list": [] 76 } 77 } 78} 79``` 80 81#### 修改napitest.cpp文件 82 83为方便调试,在napitest.cpp文件或napitest_middle.cpp文件中加入打印日志语句。以修改napitest.cpp文件为例,增加以下代码: 84 85 86``` 87 #include "napitest.h" 88 #include <hilog/log.h> 89 using namespace OHOS; 90 namespace { 91 constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, 0, "NAPITESTNAPILayer" }; 92 #define NAPITEST_LOG(fmt, ...) HiviewDFX::HiLog::Info(LABEL, \ 93 "%{public}s:%{public}d " fmt, __func__, __LINE__, ##__VA_ARGS__) 94 } 95 namespace napitest { 96 bool fun1(std::string &v, std::string &out) 97 { 98 NAPITEST_LOG("napitest fun1 begin!!!!!!!!!!!!!!"); 99 return true; 100 } 101 } 102``` 103#### 增加子系统 104 105在源码/build/subsystem_config.json中增加子系统选项。如下所示: 106 107``` 108"napitest": { 109 "project": "hmf/napitest", 110 "path": "foundation/napitest", 111 "name": "napitest", 112 "dir": "foundation" 113 } 114``` 115 116### 添加功能模块 117在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码/productdefine/common/products/rk3566.json中增加part选项,其中napitest就是上面填的subsystem_name,napitest_interface就是上面填的part_name。 118 119 "napitest:napitest_interface":{} 120 121### 编译验证 122 123编译成功后,就会生成libnapitest.z.so,目录如下所示: 124 125 /out/ohos-arm-release/packages/phone/system/lib/module 126 127## bundle.json方式集成 128### 建立模块位置 129 130模块目录理论上可以建立在OpenHarmony代码库的任何地方,假设OpenHarmony代码库的目录为`OHOS_SRC`,在`OHOS_SRC/foundation`目录下,例如建立此次测试模块目录:napitest。此时,`OHOS_SRC/foundation`目录下应该有aafwk,ace,ai, …, napitest等目录,其中napitest就是刚刚建立的,在napitest目录下,把之前用可执行文件或者插件转换出来的文件全部拷贝到该目录下,并且在该目录下新建一个文件bundle.json。例如napitest目录下有以下文件: 131 132 foundation/napitest 133 |-- binding.gyp 134 |-- BUILD.gn 135 |-- bundle.json 136 |-- napitest.cpp 137 |-- napitest.h 138 |-- napitest_middle.cpp 139 |-- test.sh 140 |-- tool_utility.cpp 141 |-- tool_utility.h 142 143### 编译修改点 144 145#### 修改build.gn文件 146 147``` 148 149 import("//build/ohos.gni") 150 151 ohos_shared_library("napitest") 152 { 153 # 指定编译源文件 154 sources = [ 155 "napitest_middle.cpp", 156 "napitest.cpp", 157 "tool_utility.cpp", 158 ] 159 include_dirs = [ 160 ".", 161 "//third_party/node/src", 162 ] 163 # 指定编译依赖,如果依赖第三方库,需要在此添加 164 deps=[ 165 "//foundation/ace/napi:ace_napi", 166 "//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog", 167 ] 168 remove_configs = [ "//build/config/compiler:no_rtti" ] 169 cflags=[ 170 ] 171 cflags_cc=[ 172 "-frtti", 173 ] 174 ldflags = [ 175 ] 176 # 指定库生成的路径 177 relative_install_dir = "module" 178 # 主要是修改下面两条内容,子系统及其组件,后面会引用 179 part_name = "napitest_interface" 180 subsystem_name = "napitest" 181 } 182``` 183 184#### 修改bundle.json文件 185其中destPath选项中的"//foundation/napitest"指的是napitest目录,":napitest"指的是上面BUILD.gn中的目标ohos_shared_library("napitest")。 186 187``` 188{ 189 "name": "@ohos/napitest", 190 "description": "napitest provides atomic capabilities", 191 "version": "3.1", 192 "license": "Apache License 2.0", 193 "publishAs": "code-segment", 194 "segment": { 195 "destPath": "foundation/napitest" 196 }, 197 "dirs": {}, 198 "scripts": {}, 199 "component": { 200 "name": "napitest_interface", 201 "subsystem": "napitest", 202 "features": [], 203 "adapted_system_type": [ 204 "standard" 205 ], 206 "rom": "10000KB", 207 "ram": "10000KB", 208 "deps": { 209 "components": [ 210 "ace_napi", 211 "ipc_core", 212 "libhilog" 213 ], 214 "third_party": [ 215 "node" 216 ] 217 }, 218 "build": { 219 "sub_component": [ 220 "//foundation/napitest:napitest" 221 ], 222 "inner_kits": [ 223 { 224 "header": { 225 "header_base": "//foundation/napitest", 226 "header_files": [ 227 "tool_utility.h", 228 "napitest.h" 229 ] 230 }, 231 "name": "//foundation/napitest:napitest" 232 } 233 ] 234 } 235 } 236} 237``` 238 239#### 修改napitest.cpp文件 240为方便调试,在napitest.cpp文件或napitest_middle.cpp文件中加入打印日志语句。以修改napitest.cpp文件为例,增加以下代码: 241 242 243``` 244 #include "napitest.h" 245 #include <hilog/log.h> 246 using namespace OHOS; 247 namespace { 248 constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, 0, "NAPITESTNAPILayer" }; 249 #define NAPITEST_LOG(fmt, ...) HiviewDFX::HiLog::Info(LABEL, \ 250 "%{public}s:%{public}d " fmt, __func__, __LINE__, ##__VA_ARGS__) 251 } 252 namespace napitest { 253 bool fun1(std::string &v, std::string &out) 254 { 255 NAPITEST_LOG("napitest fun1 begin!!!!!!!!!!!!!!"); 256 return true; 257 } 258 } 259``` 260#### 增加子系统 261 262在源码/build/subsystem_config.json中增加子系统选项。如下所示: 263 264``` 265"napitest": { 266 "project": "hmf/napitest", 267 "path": "foundation/napitest", 268 "name": "napitest", 269 "dir": "foundation" 270 } 271``` 272 273### 添加功能模块 274在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码/productdefine/common/products/rk3566.json中增加part选项,其中napitest就是上面填的subsystem_name,napitest_interface就是上面填的part_name。 275 276 "napitest:napitest_interface":{} 277 278### 编译验证 279 280编译成功后,就会生成libnapitest.z.so,目录如下所示: 281 282 /out/ohos-arm-release/packages/phone/system/lib/module 283 284## 总结 285 286两种集成方式使用场景说明: 287 288ohos.build方式集成:适合3.0前版本使用。 289 290bundle.json方式集成:兼容ohos.build方式,但3.1及以后版本建议使用此种方式集成。 291 292