NAPI Addon: как вернуть значение javascript из C ++ CALLBACK? - PullRequest
0 голосов
/ 11 марта 2020

Мой проект имеет некоторые функциональные возможности, для которых требуется другой SDK, и некоторые возвращаемые значения этого метода SDK возвращаются в C ++ CALLBACK.

как вернуть значение в javascript из c ++ CALLBACK?

простой код, подобный следующему:

код C ++

    // login callback
    void CALLBACK LoginResultCallBack(LONG lUserID)
    {
       // ??? return lUserID to javascript ???
    }

    // async login
    napi_value Login(napi_env env, napi_callback_info info) {
        // ...
        LOGIN_INFO struLoginInfo = { 0 };
        DEVICEINFO struDeviceInfoV40 = { 0 };
        // set login callback
        struLoginInfo.cbLoginResult = LoginResultCallBack;
        SDK_Login(&struLoginInfo, &struDeviceInfoV40);

        return 0;
    }

    napi_value Init(napi_env env, napi_value exports) {
        napi_property_descriptor des= { "login", NULL, Login, NULL, NULL, NULL, napi_default, NULL };
        assert(napi_define_properties(env, exports, 1, &des) == napi_ok);
        return exports;
    }

    NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)


js код

sdk.login((userId) => {
  // ??? get userId from c++ CALLBACK ???
});

1 Ответ

1 голос
/ 12 марта 2020

я думаю, что это ответ, который вы ищете:

napi_value RunCallback(napi_env env, const napi_callback_info info) {
    napi_status status;

    size_t argc = 1;
    napi_value args[1];
    status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    assert(status == napi_ok);

    napi_value cb = args[0];

    napi_value argv[1];
    status = napi_create_string_utf8(env, "hello world", NAPI_AUTO_LENGTH, argv);
    assert(status == napi_ok);

    napi_value global;
    status = napi_get_global(env, &global);
    assert(status == napi_ok);

    napi_value result;
    status = napi_call_function(env, global, cb, 1, argv, &result);
    assert(status == napi_ok);

    return nullptr;
}

это напрямую из node-addon-examples и, вероятно, есть и другие полезные примеры.

...