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回调。
- JS侧代码:
// 定义JS对象
const jsObject = {
name: "HarmonyOS",
version: "Next"
};
// 调用Native侧的方法,传递JS对象和回调函数
nativeMethod(jsObject, (response) => {
console.log("Callback from Native: ", response);
});
- 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)
- 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回调。