From 29dee58e415b445dd7081eab247247111a5db074 Mon Sep 17 00:00:00 2001 From: zhongluping <278527840@qq.com> Date: Mon, 24 Oct 2022 08:56:39 +0800 Subject: [PATCH] modify hell_napi doc Signed-off-by: zhongluping <278527840@qq.com> --- .../docs/hello_napi.md" | 77 ++++++++++++++---- .../docs/media/napi_framework.png" | Bin 0 -> 21589 bytes 2 files changed, 63 insertions(+), 14 deletions(-) create mode 100755 "docs/napi\347\263\273\345\210\227\345\255\246\344\271\240/docs/media/napi_framework.png" diff --git "a/docs/napi\347\263\273\345\210\227\345\255\246\344\271\240/docs/hello_napi.md" "b/docs/napi\347\263\273\345\210\227\345\255\246\344\271\240/docs/hello_napi.md" index a2b3efe6..a72bf0f4 100755 --- "a/docs/napi\347\263\273\345\210\227\345\255\246\344\271\240/docs/hello_napi.md" +++ "b/docs/napi\347\263\273\345\210\227\345\255\246\344\271\240/docs/hello_napi.md" @@ -1,39 +1,58 @@ # 如何通过DevEco Studio开发一个NAPI工程 + ## 简介 -NAPI(Native API)是OpenHarmony系统中的一套原生模块扩展开发框架,它基于Node.js N-API规范开发,为开发者提供了JavaScript与C/C++模块之间相互调用的交互能力。这套机制对于鸿蒙系统开发的价值有两方面: + +NAPI(Native API)是OpenHarmony系统中的一套原生模块扩展开发框架,它基于Node.js N-API规范开发,为开发者提供了JavaScript与C/C++模块之间相互调用的交互能力。如下图所示: +![napi framework](media/napi_framework.png)
+这套机制对于鸿蒙系统开发的价值有两方面: + - OpenHarmony系统系统可以将框架层丰富的模块功能通过js接口开放给上层应用使用。 - 应用开发者也可以选择将一些对性能、底层系统调用有要求的核心功能用C/C++封装实现,再通过js接口使用,提高应用本身的执行效率。 + 本文将通过一个Hello world的实例来演示如何在DevEco Studio上开发一个NAPI工程的过程。如何开发一个rom包的napi工程可以参考文档[深入浅出 OpenHarmony NAPI](https://gitee.com/javen678/hello-ohos-napi/blob/master/doc/README.md); + ## 工程准备 + ### DevEco Studio下载 + 本实例中使用的是DevEco Studio 3.0 Release版本的IDE,我们需要在[官网](https://developer.harmonyos.com/cn/develop/deveco-studio#download)下载DevEco Studio 3.0 Release版即可,DevEco Studio的安装使用请参照[DevEco Studio使用指南](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-deveco-studio-overview-0000001267924484)。 + ### SDK下载 + 下载安装完DevEco Studio工具后,我们需要下载OpenHarmony的SDK,具体步骤如下(更多详细信息请参照[DevEco Studio使用之配置开发环境](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-setting-up-environment-0000001267524540)): + - 运行已安装的DevEco Studio,首次使用,请选择**Do not import settings**,单击OK。 -- 进入DevEco Studio操作向导页面,修改**npm registry**,DevEco Studio已预置对应的仓(默认的npm仓,可能出现部分开发者无法访问或访问速度缓慢的情况),直接单击**Start using DevEco Studio**进入下一步。 - ![config](media/ide_config1.jpg) -- 设置Node.js信息,可以指定本地已安装的Node.js(Node.js版本要求为v14.19.1及以上,且低于v15.0.0;对应的npm版本要求为6.14.16及以上,且低于7.0.0版本);如果本地没有合适的版本,可以选择**Download**按钮,在线下载Node.js。本示例以下载Node.js为例,选择下载源和存储路径后,单击**Next**进入下一步。 - ![ide config2](media/ide_config2.jpg) +- 进入DevEco Studio操作向导页面,修改**npm registry**,DevEco Studio已预置对应的仓(默认的npm仓,可能出现部分开发者无法访问或访问速度缓慢的情况),直接单击**Start using DevEco Studio**进入下一步。 + ![config](media/ide_config1.jpg) +- 设置Node.js信息,可以指定本地已安装的Node.js(Node.js版本要求为v14.19.1及以上,且低于v15.0.0;对应的npm版本要求为6.14.16及以上,且低于7.0.0版本);如果本地没有合适的版本,可以选择**Download**按钮,在线下载Node.js。本示例以下载Node.js为例,选择下载源和存储路径后,单击**Next**进入下一步。 + ![ide config2](media/ide_config2.jpg) - 等待Node.js安装完成,然后单击**Finish**进入下一步。 - ![ide config3](media/ide_config3.jpg) -- 在**SDK Componets Setup**界面,设置OpenHarmony SDK下载路径,如果需要开发HarmonyOS应用,请勾选上HarmonyOS SDK,单击**Next**进入下一步。 - ![ide config4](media/ide_config4.jpg) -- 在弹出的SDK下载信息页面,单击**Next**,并在弹出的**License Agreement**窗口,阅读License协议,需同意License协议后,单击**Next**开始下载SDK。 + ![ide config3](media/ide_config3.jpg) +- 在**SDK Componets Setup**界面,设置OpenHarmony SDK下载路径,如果需要开发HarmonyOS应用,请勾选上HarmonyOS SDK,单击**Next**进入下一步。 + ![ide config4](media/ide_config4.jpg) +- 在弹出的SDK下载信息页面,单击**Next**,并在弹出的**License Agreement**窗口,阅读License协议,需同意License协议后,单击**Next**开始下载SDK。 ![ide config5](media/ide_config5.jpg) -- 等待OpenHarmony SDK及工具下载完成,单击**Finish**,这样SDK就安装完成。 +- 等待OpenHarmony SDK及工具下载完成,单击**Finish**,这样SDK就安装完成。 + ## 创建工程 + 下载并配置完SDK后,我们就可以开始创建工程了。DevEco Studio已经自带了一个Native C++ hello的模板,我们只需新建该模板的一个工程即可。 + - 打开DevEco Studio,点击左边Create Project,将会弹出对应新建工程界面。 - 选择OpenHarmony下的Native C++模板,单击Next。 ![create project](media/create_project.png) - 配置工程 选择完模板后,会弹出配置工程界面,在该界面我们需要配置工程名字,SDK版本以及Model,配置完后点击Finish,这样我们一个helloworld工程就创建完成了。 - [^注意]: SDK我们需要选9,model需要选择Stage ![config project](media/config_project.png) + ## 源码实现 + 新建完工程后,实现napi接口的hello.cpp源码在工程的entry/src/main/cpp目录下。 + ### 注册napi模块 + 先定义一个模块,对应结构体为napi_module,指定当前NAPI模块对应的模块名以及模块注册对外接口的处理函数,具体扩展的接口在该函数中声明,后面说明。 模块定义好后,调用NAPI提供的模块注册函数napi_module_register(napi_module* mod)函数注册到系统中。 + ```c++ static napi_module demoModule = { .nm_version =1, @@ -49,8 +68,11 @@ extern "C" __attribute__((constructor)) void RegisterHelloModule(void) napi_module_register(&demoModule); } ``` + ### 接口定义 + napi_property_descriptor结构体中声明了napi中对应的接口,如下所示,其中Add对应的使Native C++的接口,其应用端的接口对应为add,napi通过napi_define_properties接口将napi_property_descriptor结构体中的2个接口绑定在一起,并通过exports变量对外导出,使应用层可以调用add方法。 + ```c++ static napi_value Init(napi_env env, napi_value exports) { @@ -62,8 +84,11 @@ static napi_value Init(napi_env env, napi_value exports) return exports; } ``` + ### 接口实现 + 以下为getHelloString接口业务实现代码: + ```c++ static napi_value getHelloString(napi_env env, napi_callback_info info) { napi_value result; @@ -74,17 +99,25 @@ static napi_value getHelloString(napi_env env, napi_callback_info info) { return result; } ``` + 到此,我们已经对外导出了1个napi接口,应用端可以调用这个接口。 + ## 调用接口 + 首先,在调用napi前,我们需要导入napi库: -``` + +```js import testNapi from "libentry.so" ``` + 导入完库后,我们就可以通过导入的变量直接调用对应的napi接口: + ```c++ testNapi.getHelloString(); ``` + 而工程创建后,在index.ets文件(在工程的entry/src/main/ets/pages目录下)中系统已经默认生成了一个hello world的文本区域,且通过点击文本区域,可以调用getHelloString的napi接口,代码如下: + ```js import testNapi from "libentry.so" @Entry @@ -108,18 +141,28 @@ struct Index { } } ``` + 这时DevEco Studio工具会提示getHelloString接口未定义,我们需要在对应的index.d.ts文件(在工程的entry/src/main/cpp/types/libentry目录下)中加上该接口的定义: -``` + +```js export const getHelloString: () => string; ``` + 至此,源码实现已完成,我们可以通过点击DevEco Studio工具上Build选项中的Build Hap(s)进行编译。 + ## 安装调试 + 应用通过DevEco Studio工具安装到开发板的步骤: + ### 连接开发板 + 将开发板连接电脑,工具会自动识别到设备,如下图 ![device](media/device.png) + ### 配置签名 + 应用第一次安装到设备上的时候,是需要进行签名配置,否则无法进行安装。具体签名步骤: + - 点击工程配置按钮 点击DevEco Studio工具右上角的Project Structure按钮,弹出工程配置界面 ![config](media/config.png) @@ -129,14 +172,20 @@ export const getHelloString: () => string; - 确定签名 工具在自动生成签名信息后,直接点击ok按钮即可完成自动签名操作 ![sign ok](media/signing_ok.png) + ### 安装运行 + 配置完签名后,我们就可以直接点击DevEco Studio工具上运行按钮进行安装运行应用了 ![run](media/run.png) + ### 调试 + 应用安装运行后,在板子上我们可以在屏幕的中央看到Hello World的显示,并且我们点击Hello World后可以在DevEco Studio工具的Log窗口查看到对应的调试信息 ![log](media/log.png) 由于系统的调试信息也在log窗口显示,且信息量大,不方便我们查看自己的调试信息,所以我们可以在log窗口设置过滤信息,让窗口只显示我们过滤关键字的信息。 + ## 参考资料 + - [DevEco Studio使用指南](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-deveco-studio-overview-0000001267924484)。 - [深入浅出 OpenHarmony NAPI](https://gitee.com/javen678/hello-ohos-napi/blob/master/doc/README.md)。 -- [知识体系](https://gitee.com/openharmony-sig/knowledge/tree/master)。 \ No newline at end of file +- [知识体系](https://gitee.com/openharmony-sig/knowledge/tree/master)。 diff --git "a/docs/napi\347\263\273\345\210\227\345\255\246\344\271\240/docs/media/napi_framework.png" "b/docs/napi\347\263\273\345\210\227\345\255\246\344\271\240/docs/media/napi_framework.png" new file mode 100755 index 0000000000000000000000000000000000000000..9d6c7dd5d45245ab2e940d1a7db03258d88ace32 GIT binary patch literal 21589 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 literal 0 HcmV?d00001 -- Gitee