HarmonyOS ArkTS调用Native接口机制咨询
有份代码运行顺序是这样的,应用层连续调这两个函数:
ret = this.mediaPlayerObj.RegisterCallback(this.cb);
ret = this.mediaPlayerObj.StartPlay(plIn);
底层调用:
napi_value MediaPlayerNapi::RegisterCallback(napi_env env, napi_callback_info info){
size_t requireArgc = 1;
size_t argc = 1;
napi_value args[1] = {0};
napi_value thisVar = nullptr;
void *data = nullptr;
napi_get_cb_info(env, info, &argc, args, &thisVar, &data);
MediaPlayerNapi *mediaPlayer = nullptr;
napi_unwrap(env, thisVar, (void **)&mediaPlayer);
int32_t ret=-1;
if (mediaPlayer->mMediaPlayerPtr != nullptr) {
ret = mediaPlayer->mMediaPlayerPtr->RegistCallback(mediaPlayer);
napi_create_reference(env, args[0], 1, &(mediaPlayer->callbackObjectRef));
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "MediaPlayerNapi",
"MediaPlayerNapi::RegisterCallback time:%{public}d", clock());
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "MediaPlayerNapi",
"MediaPlayerNapi::RegisterCallback ret:%{public}d", ret);
}
else{
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "MediaPlayerNapi",
"MediaPlayerNapi::RegisterCallback mediaPlayer->mMediaPlayerPtr is nullptr");
}
napi_value res;
napi_create_int32(env, ret, &res);
return res;
}
该函数注册回调,将ArkTS层传递进来的回调对象进行了napi_create_reference保存,并利用clock()函数输出此时的时刻;
napi_value MediaPlayerNapi::StartPlay(napi_env env, napi_callback_info info){
size_t requireArgc = 1;
size_t argc = 1;
napi_value args[1] = {0};
napi_value thisVar = nullptr;
void *data = nullptr;
napi_get_cb_info(env, info, &argc, args, &thisVar, &data);
MediaPlayerNapi *mediaPlayer = nullptr;
napi_unwrap(env, thisVar, (void **)&mediaPlayer);
nog::PlayerInfo playerInfo;
ExchangePlayerInfo(env,args[0],playerInfo);
int ret = mediaPlayer->mMediaPlayerPtr->StartPlay(playerInfo);
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "MediaPlayerNapi",
"MediaPlayerNapi::StartPlay begin ret:%{public}d", ret);
napi_value res;
napi_create_int32(env,ret, &res);
return res;
}
该函数开始播放播放器,调用了so接口,之后便会有回调上来,so底层回调上来后,记录回调的时刻:
void MediaPlayerNapi::Onloading(){
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "MediaPlayerNapi", "MediaPlayerNapi::Onloading time:%{public}d",clock());
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "MediaPlayerNapi", "MediaPlayerNapi::Onloading");
if(callbackObjectRef != nullptr && playerStatus){
napi_value Onloading;
napi_status status;
napi_value callbackObject;
napi_get_reference_value(myEnv, callbackObjectRef, &callbackObject);
if(napi_ok != (status = napi_get_named_property(myEnv, callbackObject, "Onloading", &Onloading))){
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "MediaPlayerNapi", "napi_get_named_property error");
return;
};
CallbackContext *asyncContext = new CallbackContext();
asyncContext->env = myEnv;
if(napi_ok != (napi_create_reference(myEnv, Onloading, 1, &asyncContext->callbackRef))){
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "MediaPlayerNapi", "napi_create_reference error");
return;
};
asyncContext->argc = 0;
asyncContext->callbackObjectRef = callbackObjectRef;
uv_queue_work_fun(asyncContext, myEnv);
}
}
发现回调onloading的时刻比之前registercallback还早。导致反复按顺序调这两个应用层函数时,有可能出现onloading崩溃,崩溃的报错显示,在我对之前registercallback传递下来的对象进行一些属性拉取(napi_get_named_property,napi_create_reference),方法调用时会崩溃。是不是可以认为此时registercallback传递下来的对象尚未在js中可能未完成创建,导致回调上来时无法找到,但应用层是顺序调用的,理论上调用StartPlay时,registercallback已经将该对象传递下来并完成了。又或者说,Native层的机制导致即使开始执行StartPlay了,但是registercallback过程要创建的这种js桥接并不一定完成?
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
Native调用ArkTS侧类函数
880浏览 • 1回复 待解决
如何在Native侧C++子线程直接调用ArkTS接口,不用通过ArkTS侧触发回调
2007浏览 • 1回复 待解决
arkts能否直接调用nodejs的接口
1759浏览 • 1回复 待解决
HarmonyOS napi 接口线程安全咨询
266浏览 • 1回复 待解决
在Native侧调用ArkTS的全局普通方法
826浏览 • 1回复 待解决
HarmonyOS Native提供ArkTS接口Index.d.ts中如何导入class
265浏览 • 0回复 待解决
HarmonyOS overlay机制调用后界面刷新问题
452浏览 • 1回复 待解决
napi方法 arkts调用c++接口时,报错Hardware vsync is not available
141浏览 • 1回复 待解决
HarmonyOS编译运行 ArkTS与 JS混合项目,接口调用有无性能问题
339浏览 • 2回复 待解决
HarmonyOS OH_AVScreenCapture_StartScreenRecording接口权限问题咨询
349浏览 • 1回复 待解决
native项目中,在CMakeLists.txt中加入三方so库接口后调用native方法失败
2039浏览 • 1回复 待解决
ArkTS异步机制与执行顺序
1247浏览 • 1回复 待解决
如何在Native侧调用ArkTS侧异步方法,并获取异步计算结果到Native侧
2396浏览 • 1回复 待解决
HarmonyOS如何调用http/https接口?
10176浏览 • 3回复 已解决
ArkTS与Native(C/C++/Rust)通过什么方式实现调用交互
2079浏览 • 1回复 待解决
HarmonyOS 手机震动接口调用无效果
114浏览 • 1回复 待解决
HarmonyOS ArkTS注册Native C函数监听
252浏览 • 1回复 待解决
Native如何调ArkTS的方法
2104浏览 • 1回复 待解决
arkts侧hashmap转为native侧
881浏览 • 1回复 待解决
HarmonyOS 数据库秘钥一年更换一次机制咨询
180浏览 • 1回复 待解决
HarmonyOS ArkTS接口回调的案例问题
229浏览 • 1回复 待解决
HarmonyOS ArkTS接口回调的案例
374浏览 • 1回复 待解决
requestEnableNotification接口申请通知权限的机制是怎样的
2035浏览 • 1回复 待解决
如何在Native侧释放ArkTS对象
2263浏览 • 1回复 待解决
1.RegisterCallback函数中,引用保存的是:
2.Onloading函数中,是通过callbackObjectRef保存的,需要判断callbackObjectRef是否与mediaPlayer->callbackObjectRef是同一个引用。
3.Onloading函数中,Onloading是业务线程的处理函数,api_get_reference_value(myEnv, callbackObjectRef, &callbackObject);这个语句不是在myEnv环境变量生成的线程中,获取napi_value,作用域不一样,会引起崩溃,后面的 napi_get_named_property等等napi函数调用都存在作用域不一致情况请参考使用Node-API接口进行线程安全开发:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/use-napi-thread-safety-0000001774280466-V5里面介绍了,可以返回ArkTS层。