HarmonyOS 鸿蒙Next napi callback是否会失效或被提前销毁

HarmonyOS 鸿蒙Next napi callback是否会失效或被提前销毁 用cpp写的消息通道,在ts 设置回调

cli.initEnv((msg: string) => {
 hilog.info(0x0000, 'testTag', 'callback=%{public}s', msg);
})

在cpp 层通过 napi_ref 保存回调函数

由于cpp 程序在线程中存在,需跟随应用生命周期,保存的回调函数是否可能会被销毁掉?

2 回复
  1. napi_ref由您这边自行管理,需要手动delete。

  2. napi的使用标准: https://nodejs.org/docs/latest-v8.x/api/n-api.html

  3. 这边给您提供相关napi的优秀实践,以供参考: https://gitee.com/openharmony-sig/ohos_ijkplayer

  4. 关于ets与cpp解耦做法:将 type 文件转移至 ets 中,修改模块级 oh-package.json5 依赖路径file:./src/main/cpp/types/libhello -> file:./src/main/ets/types/libhello 即可

  5. 鸿蒙 import ‘*.so’ 相当于Java中的system.load()he System.loadLibray()

更多关于HarmonyOS 鸿蒙Next napi callback是否会失效或被提前销毁的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,napi(Node-API)的callback是否会失效或被提前销毁,主要取决于callback的生命周期管理。napi是用于在C/C++模块中与JavaScript进行交互的API,callback是JavaScript函数在C/C++中的表示。

napicallback在以下情况下可能会失效或被提前销毁:

  1. JavaScript对象被垃圾回收:如果callback对应的JavaScript对象被垃圾回收机制回收,callback将失效。napi提供了napi_create_referencenapi_delete_reference等API,用于管理JavaScript对象的引用,防止其被提前垃圾回收。

  2. 作用域结束:如果callback是在某个作用域内创建的,当该作用域结束时,callback可能会失效。为避免这种情况,可以使用napi_create_referencecallback的引用存储在全局或更长的生命周期中。

  3. 异步操作中的callback:在异步操作中,如果callback被调用前其对应的JavaScript对象被销毁,callback将失效。使用napi_create_referencenapi_get_reference_value可以确保callback在异步操作中仍然有效。

  4. 线程安全:在多线程环境中,如果callback被多个线程共享且未正确管理,可能会导致callback失效或提前销毁。使用napi_threadsafe_function可以确保callback在多线程环境中的正确使用。

总之,napicallback是否会失效或被提前销毁,取决于其生命周期管理。通过合理使用napi提供的引用管理和线程安全机制,可以有效避免callback失效或被提前销毁的问题。

回到顶部