HarmonyOS 如何在ArkTS中向C++层注册回调,C++层如何调用回调方法?

需要将c++层的播放状态回调给到ArtTs的界面层,不知道如何通过NAPI实现,希望能给出一个实现方案。

HarmonyOS
2024-11-25 11:07:22
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

​可以使用 napi_call_function 函数实现在Native中调用js function,参考代码如下:

1、在index.d.ts中链接ArkTS侧函数与C++侧函数:​

export const nativeCallArkTS: (cb: (a: string) => string) => string;

2、在C++测调用ArkTS侧函数:

static napi_value NativeCallArkTS(napi_env env, napi_callback_info info) { 
  size_t argc = 1; 
  // 声明参数数组 
  napi_value args[1] = {nullptr}; 
  ​ 
  // 获取传入的参数并依次放入参数数组中 
  napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
  ​ 
  // 创建一个string,作为ArkTS的入参 
  napi_value argv = nullptr; 
  napi_create_string_utf8(env, "yes", 3, &argv); 
 
  ​ 
  // 调用传入的callback,并将其结果返回 
  napi_value result = nullptr; 
  napi_call_function(env, nullptr, args[0], 1, &argv, &result); 
  return result; 
}

3、将NativeCallArkTS接口导出:

EXTERN_C_START 
static napi_value Init(napi_env env, napi_value exports) 
{ 
  napi_property_descriptor desc[] = { 
  {"nativeCallArkTS", nullptr, NativeCallArkTS, nullptr, nullptr, nullptr, napi_default, nullptr} 
}; 
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
return exports; 
} 
EXTERN_C_END

4、在ArkTS中调用函数:

import nativeFun from 'libentry.so'; 
​ 
@Entry 
@Component 
struct Index { 
  @State message: string = 'nativeCallArkTS'; 
  ​ 
  build() { 
    Row() { 
      Column() { 
        Text(this.message) 
          .onClick(() => { 
            this.message += nativeFun.nativeCallArkTS((a: string)=> { 
              return a }) 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}
分享
微博
QQ
微信
回复
2024-11-25 15:14:07
相关问题
c/c++主动调用ArkTS存在问题
788浏览 • 1回复 待解决
如何C++ 提供函数?
2714浏览 • 1回复 待解决
ArkTS通过接口访问C++对象
680浏览 • 1回复 待解决
HarmonyOSC++触发通知到ArkTS
337浏览 • 1回复 待解决
HarmonyOS C++如何同步调用JS函数 -
258浏览 • 0回复 待解决
ts给c++传递数组,c++如何解析
2155浏览 • 1回复 待解决
HarmonyOS ArkTSC++ 偶现方法找不到。
761浏览 • 1回复 待解决
通过Native 调用c++实现文本绘制
1303浏览 • 1回复 待解决
HarmonyOS ETS和c++通信
292浏览 • 1回复 待解决
C++时,如何阻塞TS主线程?
801浏览 • 1回复 待解决
HarmonyOS C++ 调用 ets 函数报错闪退
340浏览 • 1回复 待解决