HarmonyOS鸿蒙Next中在线程A使用napi_create_reference创建的ref如何在线程B中使用
HarmonyOS鸿蒙Next中在线程A使用napi_create_reference创建的ref如何在线程B中使用
在线程A使用 napi_create_reference
创建的ref,如何在线程B中使用
不好意思,可能我没描述清楚。是这样的:
我在主线程使用
napi_create_reference
创建了一个refA,然后在c++层创建了一个线程B,并且在该线程通过
napi_create_ark_runtime
创建了一个ark环境。
当我在B线程使用refA,会崩溃,提示是"param env is not equal to its owner",我记得同样用法在5.0.0.102系统版本上只是警告而已,不会崩溃。
现在最新系统版本5.0.0.115上会报崩溃具体信息:
Reason:Signal:SIGABRT(SI_TKILL)@0x01317b5b00001765 from:5989:20020059
LastFatalMessage:[(ark_native_reference.cpp:117)(Get)] param env is not equal to its owner
请问如何在B线程使用refA
更多关于HarmonyOS鸿蒙Next中在线程A使用napi_create_reference创建的ref如何在线程B中使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
Button(“跨线程调用 JS 函数”) .onClick(() => { entry.threadsTest((value:number) => { value += 10 this.cnt += 20 hilog.info(0x0000, ‘testTag’, ‘js callback value =’ + value + ", cnt = " + this.cnt); return value }) }).margin(10)
// 从 ArkTS 侧获取的参数的数量 size_t argc = 1; napi_value js_cb, work_name;
// 获取 ArkTS 参数 napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr);
在HarmonyOS鸿蒙Next中,napi_create_reference
创建的引用(ref)是线程绑定的,意味着它只能在创建它的线程中使用。如果要在线程B中使用线程A创建的引用,需要通过napi_threadsafe_function
机制来实现线程间通信。
具体步骤如下:
- 在线程A中,使用
napi_create_reference
创建引用。 - 使用
napi_create_threadsafe_function
创建一个线程安全函数,并将引用作为上下文传递给该函数。 - 在线程B中,调用
napi_call_threadsafe_function
来执行线程安全函数,并传递所需的参数。 - 在线程安全函数的回调中,可以通过
napi_get_reference_value
获取到线程A中创建的引用,并在线程B中使用它。
需要注意的是,napi_threadsafe_function
提供了线程安全的调用机制,确保在不同线程间安全地传递和使用数据。