HarmonyOS Native调用TS侧方法,会报错,TS侧方法也不能获取到对象的变量

代码示例如下:

constructor() { 
  console.log(`122313asfaf`); 
  napi.add(1, 2, this, this.call_back_function); 
} 

call_back_function(value: number) { 
  console.log(`call_back: ${value}, QNtest.test: ${this.test}`) 
}

这里回调函数会报错。业务场景:TS->Native->子线程->线程安全函数回调->TS->可以取到类对象的变量。

HarmonyOS
2024-09-11 11:33:50
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
superinsect

线程安全函数参考示例如下,示例中包括callback回调和调用类对象的方法:

// TS侧的方法定义,这里定义回调函数 call_back_function 并 声明一个方法 doTestMethod 
import napi from 'liblibrary.so'; 
export class QNtest { 
  private test: Number = 12 
  private call_back_function = (value: number) => { 
    console.log(`call_back: ${value}, QNtest.test: ${this.test}`) 
  }; 
  public doTestMethod(value: number) { 
    console.log(`doTestMethod: ${value}, QNtest.test: ${this.test}`) 
  } 
  constructor() { 
    console.log(`122313asfaf`); 
    napi.add(1, 2, this, this.call_back_function); 
  } 
}

Native侧的实现示例如下:

#include "napi/native_api.h" 
#include <thread> 
#include <threads.h> 
  struct data_info { 
  int32_t value_1; 
  int32_t value_2; 
  napi_ref js_object_this; 
}; 
static void on_state_changed_thread_safe(napi_env env, napi_value js_callback, void *context, void *data) { 
  data_info *dataInfo = (data_info *)data; 
  int32_t sumValue = dataInfo->value_1 + dataInfo->value_2; 
  napi_value sum, callResult, jsObject, jsMethod; 
  napi_create_int32(env, sumValue, &sum); 
  // 这里是回调函数 
  napi_call_function(env, nullptr, js_callback, 1, &sum, &callResult); 
  // 这里直接掉类对象的 doTestMethod 方法 
  napi_get_reference_value(env, dataInfo->js_object_this, &jsObject); 
  napi_get_named_property(env, jsObject, "doTestMethod", &jsMethod); 
  napi_call_function(env, jsObject, jsMethod, 1, &sum, &callResult); 
  // 这里释放掉引用 
  dataInfo->js_object_this = nullptr; 
} 
static void threadfunc(data_info *dataInfo, napi_threadsafe_function tsfn) { 
  // 处理耗时操作, 直接睡眠2秒 
  std::this_thread::sleep_for(std::chrono::seconds(2)); 
  napi_call_threadsafe_function(tsfn, dataInfo, napi_tsfn_blocking); 
  napi_release_threadsafe_function(tsfn, napi_tsfn_release); // 使用完后线程安全函数释放掉 
} 
static napi_value Add(napi_env env, napi_callback_info info) { 
  size_t argc = 4; 
  napi_value args[4] = {nullptr}; 
  napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
  data_info *dataInfo = new data_info(); 
  napi_get_value_int32(env, args[0], &dataInfo->value_1);            // 入参一 
  napi_get_value_int32(env, args[1], &dataInfo->value_2);            // 入参二 
  napi_create_reference(env, args[2], 1, &dataInfo->js_object_this); // 类对象 
  napi_value js_callback_fun = args[3];                              // 回调函数 
  napi_value resource_name = nullptr; 
  napi_create_string_utf8(env, "callback", NAPI_AUTO_LENGTH, &resource_name); 
  napi_threadsafe_function tsfn; 
  napi_create_threadsafe_function(env, js_callback_fun, nullptr, resource_name, 0, 1, NULL, NULL, NULL, 
  on_state_changed_thread_safe, &tsfn); 
  std::thread th(threadfunc, dataInfo, tsfn); 
  th.detach(); 
  return nullptr; 
} 
EXTERN_C_START 
static napi_value Init(napi_env env, napi_value exports) { 
  napi_property_descriptor desc[] = {{"add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr}}; 
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
return exports; 
} 
EXTERN_C_END 
static napi_module demoModule = { 
  .nm_version = 1, 
  .nm_flags = 0, 
  .nm_filename = nullptr, 
  .nm_register_func = Init, 
  .nm_modname = "library", 
  .nm_priv = ((void *)0), 
  .reserved = {0}, 
}; 
extern "C" __attribute__((constructor)) void RegisterLibraryModule(void) { napi_module_register(&demoModule); }
分享
微博
QQ
微信
回复
2024-09-11 15:56:06
相关问题
ets文件怎么调用ts文件中定义方法
2886浏览 • 1回复 待解决
c++侧可以直接调用tsstatic方法吗?
1939浏览 • 1回复 待解决
Har如何导出ts类和方法
326浏览 • 1回复 待解决
Native侧释放ArkTS对象方法
356浏览 • 1回复 待解决
HarmonyOS 如何获取对象方法列表
301浏览 • 1回复 待解决
现在不能直接创建.ts文件吗?
47浏览 • 1回复 待解决
native侧如何调用静态方法
1033浏览 • 1回复 待解决
HarmonyOS拍照后调用openSync方法报错
432浏览 • 1回复 待解决
Native调用ArkTS全局普通方法
826浏览 • 1回复 待解决
调用监听折叠屏状态方法报错
256浏览 • 1回复 待解决
如何获取对象所有方法
311浏览 • 1回复 待解决
NAPI跨线程调用TS线程函数
1038浏览 • 1回复 待解决
ArkTS层获取对象所有方法
1376浏览 • 1回复 待解决
是否会长期支持ets调用ts代码
1676浏览 • 1回复 待解决
TS侧如何批量传递函数到native
863浏览 • 1回复 待解决