Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
19983e37
D
Docs
项目概览
OpenHarmony
/
Docs
1 年多 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
19983e37
编写于
12月 02, 2022
作者:
O
openharmony_ci
提交者:
Gitee
12月 02, 2022
浏览文件
操作
浏览文件
下载
差异文件
!12061 napi文档修改
Merge pull request !12061 from luoying_ace/ly1111
上级
c80db68e
0ed146ea
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
27 addition
and
24 deletion
+27
-24
zh-cn/application-dev/napi/napi-guidelines.md
zh-cn/application-dev/napi/napi-guidelines.md
+27
-24
未找到文件。
zh-cn/application-dev/napi/napi-guidelines.md
浏览文件 @
19983e37
# Native API在应用工程中的使用指导
OpenHarmony的应用必须用js来桥接native。需要使用
[
ace_napi
](
https://gitee.com/openharmony/arkui_napi/tree/master
)
仓中提供的napi接口来处理js交互。napi提供的接口名与三方Node.js一致,目前支持部分接口,符号表见
仓下的该文件
`libnapi.ndk.json`
。
OpenHarmony的应用必须用js来桥接native。需要使用
[
ace_napi
](
https://gitee.com/openharmony/arkui_napi/tree/master
)
仓中提供的napi接口来处理js交互。napi提供的接口名与三方Node.js一致,目前支持部分接口,符号表见
ace_napi仓中的
`libnapi.ndk.json`
文件
。
## 开发流程
IDE中会
包含使用Native API的默认工程,使用
`File`
->
`New`
->
`Create Project`
创建
`Native C++`
模板工程。创建后在
`main`
目录下会包含
`cpp`
目录,可以使用ace_napi仓下提供的napi接口进行开发。
在DevEco Studio的模板工程中
包含使用Native API的默认工程,使用
`File`
->
`New`
->
`Create Project`
创建
`Native C++`
模板工程。创建后在
`main`
目录下会包含
`cpp`
目录,可以使用ace_napi仓下提供的napi接口进行开发。
js侧通过
`import`
引入native侧包含处理js逻辑的so,如:
`import hello from 'libhello.so'`
,意为使用libhello.so的能力,native侧通过napi接口创建的js对象会给到应用js侧的
`hello`
对象。
...
...
@@ -29,15 +29,15 @@ ark引擎会对js对象线程使用进行保护,使用不当会引起应用cra
### 头文件引入限制
在使用napi的对象和方法时需要引用"napi/native_api.h"。否则在只引入三方库头文件时,会出现
未支持
**接口无法找到的编译报错**
。
在使用napi的对象和方法时需要引用"napi/native_api.h"。否则在只引入三方库头文件时,会出现
接口无法找到的编译报错
。
### napi_create_async_work接口说明
napi_create_async_work里有两个回调:
*
execute:用于异步处理业务逻辑。因为不在
JS
线程中,所以不允许调用napi的接口。业务逻辑的返回值可以返回到complete回调中处理。
*
execute:用于异步处理业务逻辑。因为不在
js
线程中,所以不允许调用napi的接口。业务逻辑的返回值可以返回到complete回调中处理。
*
complete:可以调用napi的接口,将execute中的返回值封装成
JS对象返回。此回调在JS
线程中执行。
*
complete:可以调用napi的接口,将execute中的返回值封装成
js对象返回。此回调在js
线程中执行。
```
c++
napi_status
napi_create_async_work
(
napi_env
env
,
...
...
@@ -51,11 +51,11 @@ napi_status napi_create_async_work(napi_env env,
##
示例一
storage 模块——同步异步接口封装
## storage 模块——同步异步接口封装
### 模块简介
本例通过实现
`storage`
模块展示了同步和异步方法的封装。
`storage `
模块实现了数据的保存、获取、删除、清除功能。
本
示
例通过实现
`storage`
模块展示了同步和异步方法的封装。
`storage `
模块实现了数据的保存、获取、删除、清除功能。
### 接口声明
...
...
@@ -82,7 +82,7 @@ export default storage;
完整代码参见仓下路径:
[
OpenHarmony/arkui_napi
](
https://gitee.com/openharmony/arkui_napi/tree/master
)
仓库
`sample/native_module_storage/`
#### 模块注册
**1、模块注册**
如下,注册了4个同步接口(
`getSync`
、
`setSync`
、
`removeSync`
、
`clearSync`
)、4个异步接口(
`get`
、
`set`
、
`remove`
、
`clear`
)。
...
...
@@ -123,7 +123,7 @@ extern "C" __attribute__((constructor)) void StorageRegister()
}
```
#### getSync 函数实现
**2、getSync 函数实现**
如上注册时所写,
`getSync`
对应的函数是
`JSStorageGetSync`
。从
`gKeyValueStorage`
中获取数据后,创建一个字符串对象并返回。
...
...
@@ -169,7 +169,7 @@ static napi_value JSStorageGetSync(napi_env env, napi_callback_info info)
}
```
#### get 函数实现
**3、get 函数实现**
如上注册时所写,
`get`
对应的函数式
`JSStorageGet`
。
...
...
@@ -269,7 +269,7 @@ static napi_value JSStorageGet(napi_env env, napi_callback_info info)
}
```
### JS Sample Code
**4、js示例代码**
```
js
import
storage
from
'
libstorage.so
'
;
...
...
@@ -293,11 +293,11 @@ export default {
##
示例二
NetServer 模块——native与js对象绑定
## NetServer 模块——native与js对象绑定
### 模块简介
本
例展示了
`on/off/once`
订阅方法的实现,同时也包含了 C++ 与 JS
对象通过 wrap 接口的绑定。NetServer 模块实现了一个网络服务。
本
示例展示了
`on/off/once`
订阅方法的实现,同时也包含了 C++ 与 js
对象通过 wrap 接口的绑定。NetServer 模块实现了一个网络服务。
### 接口声明
...
...
@@ -315,7 +315,7 @@ export class NetServer {
完整代码参见:
[
OpenHarmony/arkui_napi
](
https://gitee.com/openharmony/arkui_napi/tree/master
)
仓库
`sample/native_module_netserver/`
#### 模块注册
**1、模块注册**
```
c
static
napi_value
NetServer
::
Export
(
napi_env
env
,
napi_value
exports
)
...
...
@@ -339,7 +339,7 @@ static napi_value NetServer::Export(napi_env env, napi_value exports)
}
```
#### 在构造函数中绑定 C++ 与 JS 对象
**2、在构造函数中绑定 C++ 与 JS 对象**
```
c
napi_value
NetServer
::
JS_Constructor
(
napi_env
env
,
napi_callback_info
cbinfo
)
...
...
@@ -366,7 +366,7 @@ napi_value NetServer::JS_Constructor(napi_env env, napi_callback_info cbinfo)
}
```
#### 从 JS 对象中取出 C++ 对象
**3、从 JS 对象中取出 C++ 对象**
```
c
napi_value
NetServer
::
JS_Start
(
napi_env
env
,
napi_callback_info
cbinfo
)
...
...
@@ -436,7 +436,7 @@ int NetServer::Start(int port)
}
```
#### 注册或释放(on/off/once)事件,以 on 为例
**4、注册或释放(on/off/once)事件,以 on 为例**
```
c
napi_value
NetServer
::
JS_On
(
napi_env
env
,
napi_callback_info
cbinfo
)
...
...
@@ -476,7 +476,7 @@ napi_value NetServer::JS_On(napi_env env, napi_callback_info cbinfo)
}
```
### JS Sample Code
**5、js示例代码**
```
javascript
import
{
NetServer
}
from
'
libnetserver.so
'
;
...
...
@@ -492,17 +492,17 @@ export default {
##
示例三
在非JS线程中回调JS接口
## 在非JS线程中回调JS接口
### 模块简介
本
模块
介绍如何在非JS线程中回调JS应用的回调函数。例如JS应用中注册了某个sensor的监听,这个sensor的数据是由一个SA服务来上报的,当SA通过IPC调到客户端时,此时的执行线程是一个IPC通信线程,与应用的JS线程是两个不同的线程。这时就需要将执行JS回调的任务抛到JS线程中才能执行,否则会出现崩溃。
本
示例
介绍如何在非JS线程中回调JS应用的回调函数。例如JS应用中注册了某个sensor的监听,这个sensor的数据是由一个SA服务来上报的,当SA通过IPC调到客户端时,此时的执行线程是一个IPC通信线程,与应用的JS线程是两个不同的线程。这时就需要将执行JS回调的任务抛到JS线程中才能执行,否则会出现崩溃。
### 具体实现
完整代码参见:
[
OpenHarmony/arkui_napi
](
https://gitee.com/openharmony/arkui_napi/tree/master
)
仓库
`sample/native_module_callback/`
#### 模块注册
**1、模块注册**
如下,注册了1个接口
`test`
,会传入一个参数,类型为包含一个参数的函数。
...
...
@@ -537,7 +537,7 @@ extern "C" __attribute__((constructor)) void CallbackTestRegister()
}
```
#### 获取env中的loop,抛任务回JS线程
**2、获取env中的loop,抛任务回JS线程**
```
c++
#include <thread>
...
...
@@ -628,7 +628,7 @@ static napi_value JSTest(napi_env env, napi_callback_info info)
}
```
### JS Sample Code
**3、js示例代码**
```
js
import
callback
from
'
libcallback.so
'
;
...
...
@@ -641,8 +641,11 @@ export default {
}
}
```
## 相关实例
针对Native API的开发,有以下相关实例可供参考:
针对Native API的开发,有以下相关完整实例可供参考:
-
[
第一个Native C++应用(ArkTS)(API9)
](
https://gitee.com/openharmony/codelabs/tree/master/NativeAPI/NativeTemplateDemo
)
-
[
Native Component(ArkTS)(API9)
](
https://gitee.com/openharmony/codelabs/tree/master/NativeAPI/XComponent
)
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录