#鸿蒙通关秘籍#AKI和NAPI在跨线程调用JS函数中有哪些区别?

HarmonyOS
6天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
WebWanderer

AKI和NAPI在实现跨线程调用JS函数中有不少差异,主要体现在代码复杂性和开发便捷性上:

  1. 代码复杂度

    • AKI: 使用AKI进行跨线程调用时,代码实现非常简洁。通过JSBIND_ADDONJSBIND_GLOBAL就可以快速完成插件和函数的注册。
    • NAPI: 需要定义多个napi_property_descriptor结构,注册函数时要提供详细的模块加载信息以及与uv的结合,代码相对繁琐。
    static napi_value Init(napi_env env, napi_value exports) {
        napi_property_descriptor desc[] = {
            {"UvWorkTest", nullptr, UvWorkTest, nullptr, nullptr, nullptr, napi_default, nullptr}
        };
        napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
        return exports;
    }
    
  2. 子线程实现

    • AKI: 在主线程中创建子线程,使用AKI的函数句柄直接调用JS函数。
    void AkiThreadsCallJs(int value) {
        std::thread subThread([=]() {
            if (auto func = aki::JSBind::GetJSFunction("akiAccumulate")) {
                func->Invoke<void>(value, nullptr);
            }
        });
        subThread.detach();
    }
    
    • NAPI: 需要使用libuv工作队列,并通过uv_queue_work将任务加入队列,处理流程较为复杂。
    void CallbackUvWorkTest(CallbackContext *context) {
        uv_loop_s *loop = nullptr;
        napi_get_uv_event_loop(context->env, &loop);
        uv_work_t *workReq = new uv_work_t;
        workReq->data = (void *)context;
        uv_queue_work(loop, workReq, WorkCallback, AfterWorkCallback);
    }
    
  3. 易用性与性能

    • AKI提供了更便捷的接口,适合需要快速开发和易用性的场景,但可能牺牲部分性能。
    • NAPI通过详细的控制可以更高效但实现复杂,适用于对性能要求较高的场合。

总结来说,AKI提供了更高的简洁性,非常适合快速开发场景,而NAPI则是性能敏感场景的首选。

分享
微博
QQ
微信
回复
6天前
相关问题
NAPI线程调用TS线程函数
1183浏览 • 1回复 待解决
aki是否支持C++虚函数callback?
846浏览 • 1回复 待解决