#鸿蒙通关秘籍#在HarmonyOS NEXT中NAPI与AKI跨语言调用有何区别?

HarmonyOS
7天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
星辰巅SKU

在HarmonyOS NEXT中,NAPI与AKI都可以实现跨语言调用,但二者在使用上存在一些区别:

  1. 初始化方式:

    • AKI使用JSBIND_ADDONJSBIND_GLOBAL进行简化初始化,更加便利。
    • NAPI则需要定义napi_property_descriptor结构体,通过额外的配置来加载模块。
    // AKI初始化
    JSBIND_ADDON(aki_use_practice)
    JSBIND_GLOBAL() {
      JSBIND_FUNCTION(AkiThreadsCallJs);
    }
    
    // NAPI初始化
    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在实现跨语言调用时,代码相对简洁,只需定义并绑定函数即可。
    • NAPI需要更复杂的步骤,包括定义回调结构和利用libuv进行事件循环。
    // AKI调用示例
    void AkiThreadsCallJs(int value) {
        if (auto func = aki::JSBind::GetJSFunction("akiAccumulate")) {
            std::function<void(int)> callback = [](int value) {};
            func->Invoke<void>(value, callback);
        }
    }
    
    // NAPI调用示例
    static napi_value UvWorkTest(napi_env env, napi_callback_info info) {
        size_t argc = 1;
        napi_value argv[1] = {0};
        napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
        
        // Create new thread and add tasks to libuv queue
        uv_queue_work(loop, workReq, WorkCallback, AfterWorkCallback);
    }
    
  3. 性能与使用场景:

    • AKI在语法上更加简化,适合开发对性能要求不是特别高但需要更高易用性的应用场景。
    • NAPI由于对底层控制更为精细,适合对性能有更高要求的应用。

通过以上对比,可以根据具体的开发需求选择合适的跨语言调用方式。


分享
微博
QQ
微信
回复
7天前
相关问题
NAPI线程调用TS线程函数
1181浏览 • 1回复 待解决
鸿蒙2.0,欧拉和C++20,区别
6335浏览 • 1回复 待解决