HarmonyOS ts创建worker,env传到C++回调到达C++之后,拿着一开始传下来的env去调ts对象的方法crash
操作流程:
1、ts创建worker,env传到C++。
2、在worker上创建imageReceiver用于接收视频采集的数据打开相机,worker线程会触发视频采集回调 -> C++。
3、回调到达C++之后,拿着一开始传下来的env去调ts对象的方法(这个对象是通过napi_deserialize反序列化拿到的)。
现象:
1、到第3步程序崩溃。
2、如果第3步创建新的env去调ts对象的方法,代码看起来正常,但在设计上有问题的,1个线程出现了2个env。
报错信息如下:
Fault thread info:
Tid:8412, Name:WorkerThread
#00 pc 00000000004ceb18 /system/lib64/platformsdk/libark_jsruntime.so(panda::ObjectRef::Set(panda::ecmascript::EcmaVM const*, char const*, panda::Local<panda::JSValueRef>)+244)(95b2781bd3970de0ded17d64930b4bc8)
#01 pc 000000000004da98 /system/lib64/platformsdk/libace_napi.z.so(napi_set_named_property+184)(b6e1f7201887fd380757eb122af83fe1)
#02 pc 0000000000ad4818 /data/storage/el1/bundle/libs/arm64/libnertc_sdk.so(nertc_sdk::LiteVideoFrameObserverWrapper::OnVideoFrameCaptured(void*, litesdk::LiteSDKVideoColorFormat, unsigned int, unsigned int, unsigned int, long*, unsigned int*, litesdk::LiteSDKVideoFrameRotationType)::$_0::operator()(napi_env__*) const+1064)(6663d48bb3f4d7584c04f4f6c87258fbd5ab2343)
========SubmitterStacktrace========
#00 pc 0000000000013c08 /system/lib64/platformsdk/libuv.so(uv_queue_work+80)(5e97289dc82f6e538b08c684a9dca4a8)
#01 pc 0000000000057aa8 /system/lib64/platformsdk/libace_napi.z.so(NativeAsyncWork::Queue()+196)(b6e1f7201887fd380757eb122af83fe1)
#02 pc 000000000005f794 /system/lib64/platformsdk/libace_napi.z.so(napi_queue_async_work+36)(b6e1f7201887fd380757eb122af83fe1)
#03 pc 0000000000082e10 /system/lib64/platformsdk/libimage_napi.z.so(OHOS::Media::JsCreateWork(napi_env__*, char const*, void (*)(napi_env__*, OHOS::Media::ImageAsyncContext*), void (*)(napi_env__*, napi_status, OHOS::Media::ImageAsyncContext*), OHOS::Media::ImageAsyncContext*)+124)(a1c414b7393bec86bcf0226b55f66850)
#04 pc 00000000000826a0 /system/lib64/platformsdk/libimage_napi.z.so(OHOS::Media::ImageNapi::JsGetComponent(napi_env__*, napi_callback_info__*) (.cfi)+632)(a1c414b7393bec86bcf0226b55f66850)
#05 pc 00000000000359b0 /system/lib64/platformsdk/libace_napi.z.so(panda::JSValueRef ArkNativeFunctionCallBack<true>(panda::JsiRuntimeCallInfo*)+224)(b6e1f7201887fd380757eb122af83fe1)
#06 pc 0000000000302058 /system/lib64/module/arkcompiler/stub.an(RTStub_PushCallArgsAndDispatchNative+44)
#07 pc 000000000000ac08 /system/lib64/module/arkcompiler/stub.an(BCStub_HandleCallthis2Imm8V8V8V8+328)
#08 pc ffffffa5f47c0002 /system/lib64/module/arkcompiler/stub.an
Registers:
x0:0000005a0b4ecef8 x1:00000022a0157be8 x2:0000000000000004 x3:0000000000000001
x4:8000000000000000 x5:ff6773604f716843 x6:ff6773604f716843 x7:7f7f7f7f7f7f7f7f
x8:0000005a0b4ecf00 x9:0000005a0b4ee000 x10:0000000000000000 x11:0000000000000061
x12:0000000000006474 x13:00000000002eefaa x14:000000000000754a x15:0000000000000000
x16:00000059f465a588 x17:00000059f432a568 x18:ffff000000000006 x19:0000005a0b3b0348
x20:ffff000000000006 x21:0000000000000001 x22:8b7809a6a99f2039 x23:0000005b10d163a3
x24:00000022a19f5eb8 x25:0000005a0b3a9580 x26:0000000000000003 x27:0000005b13f2aa30
x28:0000005b13f2a9f0 x29:0000005b13f29450
lr:00000059f450eb10 sp:0000005b13f29260 pc:00000059f450eb18
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
有没有从ts设置回调到c++层,然后c++再回调到ts的示例代码?
1143浏览 • 1回复 待解决
在C++回调时,如何阻塞TS主线程?
674浏览 • 1回复 待解决
HarmonyOS C++反序列化拿到了ts对象后怎么调对象方法
11浏览 • 1回复 待解决
c++创建的(napi_create_object),或者作为参数传下来的js value,如果想持久持有,需要怎么做?
2035浏览 • 1回复 待解决
如何在C/C++ 创建ArkTS的对象
2481浏览 • 1回复 待解决
ts给c++传递数组,c++层如何解析
2097浏览 • 1回复 待解决
c++侧可以直接调用ts的static方法吗?
2285浏览 • 1回复 待解决
HarmonyOS C/C++库开发 C侧和TS之间的数据交互
826浏览 • 1回复 待解决
把ts类传到c++层,然后可选择性的运行对应类的方法
924浏览 • 1回复 待解决
HarmonyOS 如何在ArkTS中向C++层注册回调,C++层如何调用回调方法?
540浏览 • 1回复 待解决
HarmonyOS C++自创线程如何回调到ArkTS应用中?
361浏览 • 1回复 待解决
Native侧获取env具有线程限制,如何在C++子线程触发ArkTS侧回调
2235浏览 • 1回复 待解决
HarmonyOS C++调TS函数的时候怎么传byte数组参数过去
132浏览 • 1回复 待解决
HarmonyOS napi如何传递一个对象,然后C++侧调用这个对象内部的回调方法
585浏览 • 1回复 待解决
如何为 C++ 提供回调函数?
2620浏览 • 1回复 待解决
HarmonyOS ts中继承的类,怎么和C++中的类对象进行绑定
242浏览 • 1回复 待解决
N-API接口实现ArkTS/TS/JS和C/C++之间的交互
1675浏览 • 1回复 待解决
HarmonyOS 继承自C++类的TS类如何使用Sendable协议
234浏览 • 0回复 待解决
HarmonyOS 在TS侧创建Descriptor,和C++侧的ArkUINode有对应的关联关系吗?
270浏览 • 1回复 待解决
init中的env是否可以缓存,native层会将接收到的消息传递到ts侧需要env,请问可以使用init中的env吗?
1813浏览 • 2回复 待解决
ArkTS对象绑定的C++对象如何回收?
1085浏览 • 1回复 待解决
HarmonyOS ArkTS如何调C++的api,或C++如何调用ArkTS的api
215浏览 • 1回复 待解决
native回调到ts层的object,ts层获取其成员变量
1209浏览 • 1回复 待解决
HarmonyOS ArkTS调C++ 偶现方法找不到。
680浏览 • 1回复 待解决
如何实现ArkTS与C/C++的对象传递
842浏览 • 1回复 待解决
1、worker线程的env不能跨其他线程使用,会产生多线程问题导致崩溃。1个线程出现了2个env,属于多线程问题。
多线程检测,请参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-multi-thread-check-0000001919872114-V5
2、可以通过线程安全函数的方式解决,请参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/use-napi-thread-safety-V5在主线程执行napi_create_threadsafe_function,在触发视频采集回调 到达 Native C++ 的回调后,执行napi_call_threadsafe_function调用,进入到napi_create_threadsafe_function函数的倒数第二参数CallJs函数中执行,该函数的执行是在主线程,可以在这个将一些业务数据通过napi_call_function 函数(需要将TS对象在主线程中传递下来)调用TS对象的方法,可以在Native C++层创建一个通过,通过napi_set_named_property设置对象属性,并将该对象作为TS对象的方法参数返回到TS层。
3、其他参考如何在C++的子线程调用从ArkTS传递过来的function:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-ndk-26-V5
NAPI执行上层回调时,如何获取env:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-ndk-29-V5
Native侧如何获取ArkTS侧类实例:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-ndk-53-V5