HarmonyOS鸿蒙Next中js对象传递到native侧并实现callback回调,是否有相应的示例?

HarmonyOS鸿蒙Next中js对象传递到native侧并实现callback回调,是否有相应的示例? js对象传递到native侧,然后实现callback回调。是否有相应的示例。

3 回复

native侧实现

NativeBase::m_nativeBase;

napi_value NativeBase::jsSetListener(napi_env env, napi_callback_info info) {

    OH_LOG_INFO(LOG_APP, "JS_SetListener call begin");

    size_t argc = 1;

    napi_value argv[1] = {NULL};

    napi_status status = napi_get_cb_info(env, info, &argc, argv, NULL, NULL);

    if (status != napi_ok)
        return nullptr;

    napi_value listener = argv[0];

    status = napi_create_reference(env, listener, 1, &NativeBase::GetInstance()->js_onProgressChangedListener);

    if (status != napi_ok)
        return nullptr;

    OH_LOG_INFO(LOG_APP, "JS_SetListener call end");

    return nullptr;
}

static void CallJs(napi_env env, napi_value js_cb, void *context, void *data) {

    OH_LOG_INFO(LOG_APP, "CallJs begin");

    napi_value listener = nullptr;

    napi_status status = napi_get_reference_value(env, NativeBase::GetInstance()->js_onProgressChangedListener, &listener);

    if (status != napi_ok) {
        return;
    }

    napi_value js_callback = nullptr;

    status = napi_get_named_property(env, listener, "onProgressChanged", &js_callback);

    if (status != napi_ok)
        return;

    ThreadData *prop = (ThreadData *)data;

    napi_value progress[1];
    napi_create_int32(env, prop->progress * 10, &progress[0]);
    napi_value result = nullptr;
    status = napi_call_function(env, NULL, js_callback, 1, progress, &result);

    if (status != napi_ok) {
        return;
    }

    OH_LOG_INFO(LOG_APP, "CallJs end");
}

napi_value NativeBase::jsExecuteTask(napi_env env, napi_callback_info info) {

    OH_LOG_INFO(LOG_APP, "jsExecuteTask begin");

    if (NativeBase::GetInstance()->js_onProgressChangedListener == nullptr) {
        OH_LOG_ERROR(LOG_APP, "jsExecuteTask js_onProgressChangedListener is null");
        return nullptr;
    }

    size_t argc = 1;

    napi_value jsCb = nullptr;
    napi_get_cb_info(env, info, &argc, &jsCb, nullptr, nullptr);

    // 创建一个线程安全函数
    napi_value resourceName = nullptr;
    napi_create_string_utf8(env, "Thread-safe Function Demo", NAPI_AUTO_LENGTH, &resourceName);
    napi_status status =
        napi_create_threadsafe_function(env, NULL, NULL, resourceName, 0, 1, NULL, NULL, NULL, CallJs, &NativeBase::GetInstance()->tsfn);

    if (status != napi_ok) {
        return nullptr;
    }

    std::thread t({
        OH_LOG_INFO(LOG_APP, "thread begin");

        int32_t num = 0;

        while (num < 10) {
            num++;
            std::this_thread::sleep_for(std::chrono::milliseconds(2000));
            OH_LOG_INFO(LOG_APP, "threadFunc: %s", "耗时2s");
            ThreadData *data = new ThreadData();
            data->progress = num;
            napi_call_threadsafe_function(NativeBase::GetInstance()->tsfn, data, napi_tsfn_nonblocking);
        }

        OH_LOG_INFO(LOG_APP, "thread end");
    });

    t.detach();

    OH_LOG_INFO(LOG_APP, "jsExecuteTask end");

    return nullptr;
}

napi_value NativeBase::jsReleaseListener(napi_env env, napi_callback_info info) {

    OH_LOG_INFO(LOG_APP, "jsReleaseListener");

    NativeBase::GetInstance()->js_onProgressChangedListener = nullptr;

    return nullptr;
}

头文件定义

struct ThreadData {
    int32_t progress;
};

class NativeBase {

public:
    static NativeBase *GetInstance() { return &NativeBase::m_nativeBase; }

    void Export(napi_env env, napi_value exports);
    static napi_value jsSetListener(napi_env env, napi_callback_info info);
    static napi_value jsExecuteTask(napi_env env, napi_callback_info info);
    static napi_value jsReleaseListener(napi_env env, napi_callback_info info);
    static napi_value nativetoJs(napi_env env);

public:
    static NativeBase m_nativeBase;
    std::string m_id;

public:
    napi_ref js_onProgressChangedListener;
    napi_threadsafe_function tsfn;
};

index.d.ts导出

// TS注册对象到native侧
export const setListener: (listener: object) => void;

// native执行耗时业务,并将结果传递给ts侧
export const executeTask: () => void;

// 销毁注册的对象
export const releaseListener: () => void;

ets侧用于回调的接口

private mListener: onProgressChangedListener = {
    onProgressChanged: (progress: number) => {
        log.info(`onProgressChanged: ${progress}`);
    }
};

更多关于HarmonyOS鸿蒙Next中js对象传递到native侧并实现callback回调,是否有相应的示例?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)Next中,通过JS与Native侧进行交互时,可以使用Native API实现对象的传递和回调。以下是一个简单的示例,展示了如何将JS对象传递到Native侧并实现callback回调。

  1. JS侧代码
// 定义JS对象
const jsObject = {
    name: "HarmonyOS",
    version: "Next"
};

// 调用Native侧的方法,传递JS对象和回调函数
nativeMethod(jsObject, (response) => {
    console.log("Callback from Native: ", response);
});
  1. Native侧代码(C++)
#include "napi/native_api.h"

// 定义Native方法
static napi_value NativeMethod(napi_env env, napi_callback_info info) {
    size_t argc = 2;
    napi_value args[2];
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);

    // 获取JS对象
    napi_value jsObject = args[0];

    // 解析JS对象
    napi_value nameValue, versionValue;
    napi_get_named_property(env, jsObject, "name", &nameValue);
    napi_get_named_property(env, jsObject, "version", &versionValue);

    char name[256], version[256];
    size_t nameLen, versionLen;
    napi_get_value_string_utf8(env, nameValue, name, 256, &nameLen);
    napi_get_value_string_utf8(env, versionValue, version, 256, &versionLen);

    // 处理JS对象
    printf("Received from JS: name=%s, version=%s\n", name, version);

    // 回调JS
    napi_value callback = args[1];
    napi_value response;
    napi_create_string_utf8(env, "Native response", NAPI_AUTO_LENGTH, &response);
    napi_call_function(env, nullptr, callback, 1, &response, nullptr);

    return nullptr;
}

// 注册Native方法
static napi_value Init(napi_env env, napi_value exports) {
    napi_property_descriptor desc = { "nativeMethod", 0, NativeMethod, 0, 0, 0, napi_default, 0 };
    napi_define_properties(env, exports, 1, &desc);
    return exports;
}

NAPI_MODULE(NativeModule, Init)
  1. JS与Native绑定

module.json5中配置Native模块:

{
    "nativeModules": [
        {
            "name": "NativeModule",
            "path": "libnative.so"
        }
    ]
}

这个示例展示了如何将JS对象传递到Native侧,并在Native侧处理完成后通过callback回调JS。

在HarmonyOS鸿蒙Next中,你可以使用@ohos.napi模块将JS对象传递到Native侧,并实现callback回调。以下是一个简单的示例:

Native侧代码:

#include "napi/native_api.h"

static napi_value CallbackExample(napi_env env, napi_callback_info info) {
    napi_value jsCallback;
    napi_get_cb_info(env, info, nullptr, nullptr, nullptr, &jsCallback);

    napi_value result;
    napi_call_function(env, nullptr, jsCallback, 0, nullptr, &result);

    return result;
}

static napi_value Init(napi_env env, napi_value exports) {
    napi_property_descriptor desc = {"callbackExample", nullptr, CallbackExample, nullptr, nullptr, nullptr, napi_default, nullptr};
    napi_define_properties(env, exports, 1, &desc);
    return exports;
}

NAPI_MODULE(NativeModule, Init)

JS侧代码:

import nativeModule from 'libnative.so';

function myCallback() {
    console.log("Callback from Native side!");
}

nativeModule.callbackExample(myCallback);

这个示例展示了如何在Native侧调用JS回调函数。通过napi_call_function,你可以在Native代码中触发JS回调。

回到顶部