HarmonyOS NAPI Native侧随时回调JS侧如何实现?

HarmonyOS NAPI Native侧随时回调JS侧如何实现?
napi_env 和 回调函数如何暂存,使用napi_ref仍会置0。

阅读 911
avatarAI BotBETA

在HarmonyOS的NAPI(Native API)中,Native侧回调JS侧的功能通常涉及几个关键步骤,包括创建并持久化JS函数引用、在适当的时候调用这个引用,以及管理这些引用的生命周期。以下是一个基本的实现流程,以及如何解决napi_ref被置为0的问题。

步骤 1: 创建JS函数引用

首先,你需要在JS侧创建一个函数,并通过某种方式(如模块导出)使其对Native侧可见。然后,在Native侧,你需要使用napi_create_reference(或类似函数,具体取决于NAPI的版本)来创建一个对这个JS函数的引用。

napi_ref callback_ref;
napi_value js_function;
// 假设js_function已经通过某种方式(如napi_get_named_property)获得
napi_create_reference(env, js_function, 1, &callback_ref);

步骤 2: 持久化引用

由于napi_ref是一个本地引用,它可能在垃圾回收时被清理。为了确保你的引用在需要时一直有效,你需要将其存储在一个全局或长期存在的结构体中。

typedef struct {
    napi_ref callback_ref;
    // 其他可能需要的数据
} MyModuleData;

// 假设你有一个全局的或长期存在的MyModuleData实例
MyModuleData *module_data = ...;
module_data->callback_ref = callback_ref;

步骤 3: 调用JS回调函数

当Native侧需要调用JS侧的回调函数时,你可以使用napi_get_reference_value来获取napi_value,然后使用napi_call_function来执行它。

napi_value global, thisArg, result;
napi_get_global(env, &global);
napi_get_reference_value(env, module_data->callback_ref, &js_function);
// 准备thisArg和参数(如果有)
napi_call_function(env, global, js_function, argc, argv, &result);

解决napi_ref被置为0的问题

如果你发现napi_ref被意外地置为0,这通常是因为对napi_ref的管理不当。确保你没有在不需要时删除引用(使用napi_delete_reference),并且没有在不适当的上下文中访问它(例如,在模块卸载后)。

此外,如果你在使用多线程或异步操作时处理napi_ref,请确保你的访问是线程安全的,并且没有在任何可能导致资源释放的回调或事件中意外访问它。

总结

确保napi_ref的正确管理(创建、持久化和删除)是实现Native侧回调JS侧功能的关键。如果你遵循上述步骤,并且注意线程安全和资源管理,你应该能够成功地实现这一功能。如果问题仍然存在,建议检查你的代码是否有逻辑错误或资源管理不当的地方。

1 个回答

env可以缓存,但是不能跨线程访问,如果c++中的子线程要使用env需要调用napi_call_threadsafe_function方法切换到env线程来使用env。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题