您所在位置:主页 > IT技术 >

Native API 在 HarmonyOS 应用工程中的使用指导

华宇网站建设 IT技术

  HarmonyOS 的应用必须用 js 来桥接 native。需要使用

  仓中提供的 napi 接口来处理 js 交互。napi 提供的接口名与三方 Node.js 一致,目前支持部分接口,符号表见 ace_napi 仓中的 libnapi.ndk.json 文件。

  在 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 对象。

  ● 

  nm_register_func 对应的函数需要加上 static,防止与其他 so 里的符号冲突。

  ● 

  模块注册的入口,即使用__attribute__((constructor))修饰的函数的函数名需要确保不与其他模块重复。

  ● 

  每个模块对应一个 so。

  ● 

  如模块名为 hello,则 so 的名字为 libhello.so,napi_module 中 nm_modname 字段应为 hello,大小写与模块名保持一致,应用使用时写作:import hello from 'libhello.so'。

  ark 引擎会对 js 对象线程使用进行保护,使用不当会引起应用 crash,因此需要遵循如下原则:

  ● 

  napi 接口只能在 js 线程使用。

  ● 

  env 华宇平台 与线程绑定,不能跨线程使用。native 侧 js 对象只能在创建时的线程使用,即与线程所持有的 env 绑定。

  在使用 napi 的对象和方法时需要引用"napi/native_api.h"。否则在只引入三方库头文件时,会出现接口无法找到的编译报错。

  napi_create_async_work 里有两个回调:

  ● 

  execute:用于异步处理业务逻辑。因为不在 js 线程中,所以不允许调用 napi 的接口。业务逻辑的返回值可以返回到 complete 回调中处理。

  ● 

  complete:可以调用 napi 的接口,将 execute 中的返回值封装成 js 对象返回。此回调在 js 线程中执行。

  本示例通过实现 storage 模块展示了同步和异步方法的封装。storage 模块实现了数据的保存、获取、删除、清除功能。

  完整代码参见仓下路径:

  仓库 sample/native_module_storage/

  1、模块注册

  如下,注册了 4 个同步接口(getSync、setSync、removeSync、clearSync)、4 个异步接口(get、set、remove、clear)。

  2、getSync 函数实现

  如上注册时所写,getSync 对应的函数是 JSStorageGetSync 。从 gKeyValueStorage 中获取数据后,创建一个字符串对象并返回。

  3、get 函华宇平台数实现

  如上注册时所写,get 对应的函数式 JSStorageGet。

  4、js 示例代码

  本示例展示了 on/off/once 订阅方法的实现,同时也包含了 C++ 与 js 对象通过 wrap 接口的绑定。NetServer 模块实现了一个网络服务。

  完整代码参见:

  仓库 sample/native_module_netserver/

  1、模块注册

  2、在构造函数中绑定 C++ 与 JS 对象

  3、从 JS 对象中取出 C++ 对象

  netServer->Start 后回调通过 on 注册的 start 事件。

  4、注册或释放(on/off/once)事件,以 on 为例

  5、js 示例代码

  本示例介绍如何在非 JS 线程中回调 JS 应用的回调函数。例如 JS 应用中注册了某个 sensor 的监听,这个 sensor 的数据是由一个 SA 服务来上报的,当 SA 通过 IPC 调到客户端时,此时的执行线程是一个 IPC 通信线程,与应用的 JS 线程是两个不同的线程。这时就需要将执行 JS 回调的任务抛到 JS 线程中才能执行,否则会出现崩溃。

  完整代码参见:

  仓库 sample/native_module_callback/

  1、模块注册

  如下,注册了 1 个接口 test,会传入一个参数,类型为包含一个参数的函数。

  2、获取 env 中的 loop,抛任务回 JS 线程

  3、 

  js 示例代码

上一篇:华宇注册用注册表更改DNS的代码分享

下一篇:华宇开户PHP编程处理算法错误是一项非常重要的任务
相关文章
评论留言