实现了自研的har包,底层使用C++实现,上层也有ArkTS的实现。
当C触发arkTs的方法时,需要在C层缓存了napi\_env,,然后通过异步任务 napi\_create\_async\_work,napi\_queue\_async\_work 将C的事件放到arkTs的线程中执行。同时C缓存了上层设置的回调对象,在异步任务的线程中,通过napi\_get\_named\_property,napi\_call\_function 执行arkTs的方法。实现方法和这篇文章类似: https://blog.csdn.net/licui1000/article/details/134729566
Q:
- 上面的方法是否可行?
- C++层缓存的 napi\_env 有可能失效吗,会进一步导致崩溃吗?
解决方案:
1.上面方法可行。
2.不会:因存储的是主线的env。备注:主线程的env,存储起来,没有问题,也能够在后续的调用中使用,但是,不能跨线程使用,跨线程使用会崩溃。其他线程的env不要缓存,如taskpool创建的线程在线程运行结束后,就会销毁,此时,存储的env不能再使用,使用会崩溃。