HarmonyOS native回调ts时报错stack-buffer-overflow
native回调ts时报错stack-buffer-overflow,代码如下:
Index.ets:
import { hilog } from '@kit.PerformanceAnalysisKit';
import testNapi from 'libentry.so';
@Entry
@Component
struct Index {
  @State message: string = 'Test Node-API callNative result: ';
  @State message2: string = 'Test Node-API nativeCallArkTS result: ';
  private msg :string |undefined= undefined;
  private cnt:number = 0
  build() {
    Row() {
      Column() {
        Text(this.message2)
          .fontSize(16)
          .fontWeight(FontWeight.Bold)
        Button('注册log').btnStyle().onClick(() => {
          testNapi.registerLog((type: number, level: number, domain: number, tag: string, msg: string)=>{
            this.message2+= tag
          })
        })
        Button('打印log').btnStyle().onClick(() => {
          hilog.info(0x0000, '当前cnt =%{public}d',this.cnt );
          this.cnt ++;
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}
@Extend(Button) function btnStyle() {
  .width('100%')
  .margin({ top: 8 })
}
Index.d.ts:
export const registerLog:(cb:(type: number, level: number, domain: number, tag: string, msg: string)=>void) => void;
C++:
#include <hilog/log.h>
#include <string>
#include "napi/native_api.h"
using namespace std;
#include "hilog/log.h"
#include <node_api.h>
#include <iostream>
#undef LOG_DOMAIN
#undef LOG_TAG
#define LOG_DOMAIN 0x3200 // 全局domain宏,标识业务领域
#define LOG_TAG "MY_TAG111"  // 全局tag宏,标识模块日志tag
napi_env g_env;
napi_callback_info g_info;
napi_ref g_callback_ref;
void MyHiLog(const LogType type, const LogLevel level, const unsigned int domain, const char *tag, const char *msg) {
  if (g_env == nullptr || g_callback_ref == nullptr) {
    std::cerr << "Environment or callback reference is null" << std::endl;
    return;
  }
  napi_handle_scope scope;
  napi_status status = napi_open_handle_scope(g_env, &scope);
  if (status != napi_ok) {
    std::cerr << "Failed to open handle scope" << std::endl;
    return;
  }
  napi_value global;
  status = napi_get_global(g_env, &global);
  if (status != napi_ok) {
    std::cerr << "Failed to get global object" << std::endl;
    napi_close_handle_scope(g_env, scope);
    return;
  }
  napi_value callback;
  status = napi_get_reference_value(g_env, g_callback_ref, &callback);
  if (status != napi_ok) {
    std::cerr << "Failed to get callback reference" << std::endl;
    napi_close_handle_scope(g_env, scope);
    return;
  }
  napi_value argv[5];
  status = napi_create_int32(g_env, type, &argv[0]);
  if (status != napi_ok) {
    std::cerr << "Failed to create int32 for type" << std::endl;
    napi_close_handle_scope(g_env, scope);
    return;
  }
  status = napi_create_int32(g_env, level, &argv[1]);
  if (status != napi_ok) {
    std::cerr << "Failed to create int32 for level" << std::endl;
    napi_close_handle_scope(g_env, scope);
    return;
  }
  status = napi_create_uint32(g_env, domain, &argv[2]);
  if (status != napi_ok) {
    std::cerr << "Failed to create uint32 for domain" << std::endl;
    napi_close_handle_scope(g_env, scope);
    return;
  }
  status = napi_create_string_utf8(g_env, tag, NAPI_AUTO_LENGTH, &argv[3]);
  if (status != napi_ok) {
    std::cerr << "Failed to create string for tag" << std::endl;
    napi_close_handle_scope(g_env, scope);
    return;
  }
  status = napi_create_string_utf8(g_env, msg, NAPI_AUTO_LENGTH, &argv[4]);
  if (status != napi_ok) {
    std::cerr << "Failed to create string for msg" << std::endl;
    napi_close_handle_scope(g_env, scope);
    return;
  }
  napi_valuetype valuetype;
  status = napi_typeof(g_env, callback, &valuetype);
  if (status != napi_ok || valuetype != napi_function) {
    std::cerr << "Callback is not a function" << std::endl;
    napi_close_handle_scope(g_env, scope);
    return;
  }
  napi_value result;
  std::cerr << "Calling JavaScript function..." << std::endl;
  status = napi_call_function(g_env, global, callback, 5, argv, &result);
  if (status != napi_ok) {
    std::cerr << "Failed to call function" << std::endl;
  } else {
    std::cerr << "Function called successfully" << std::endl;
  }
  napi_close_handle_scope(g_env, scope);
}
static napi_value registerLog(napi_env env, napi_callback_info info) {
  size_t argc = 1;
  napi_value args[1];
  napi_status status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  if (status != napi_ok) {
    napi_throw_error(env, nullptr, "Failed to get callback info");
    return nullptr;
  }
  if (argc < 1) {
    napi_throw_error(env, nullptr, "Callback function expected");
    return nullptr;
  }
  status = napi_create_reference(env, args[0], 1, &g_callback_ref);
  if (status != napi_ok) {
    napi_throw_error(env, nullptr, "Failed to create reference");
    return nullptr;
  }
  g_env = env;
  // 注册回调接口
  OH_LOG_SetCallback(MyHiLog);
  return nullptr;
}
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports) {
  napi_property_descriptor desc[] = {
    {"registerLog", nullptr, registerLog, 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 = "entry",
  .nm_priv = ((void *)0),
  .reserved = {0},
};
extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }
报错信息:
Reason:Signal:SIGSEGV(SEGV_ACCERR)@0x0000005bb4261ff0  current thread stack low address = 0x0000005bb4262000, probably caused by stack-buffer-overflow
        HarmonyOS
      
        赞
        
 收藏 0
 回答 1
 
        待解决
        
相关问题
 native回调到ts层的object,ts层获取其成员变量 
2274浏览  • 1回复 待解决
HarmonyOS Native和TS IPC通信,Native的SendRequest是否有异步回调的方式,目前只看到同步的接口 
1074浏览  • 1回复 待解决
HarmonyOS http请求回调后,showToast报错。 
1491浏览  • 1回复 待解决
Napi回调ArkTS,Native侧日志通过监听回调到JS侧 
2553浏览  • 1回复 待解决
在C++回调时,如何阻塞TS主线程? 
1871浏览  • 1回复 待解决
HarmonyOS react-native项目引用native-stack插件失败 
1463浏览  • 1回复 待解决
HarmonyOS Native调用TS侧方法,会报错,TS侧方法也不能获取到对象的变量 
1499浏览  • 1回复 待解决
HarmonyOS 运行HmosWorld时报错 
1523浏览  • 1回复 待解决
HarmonyOS 事件回调 
1344浏览  • 1回复 待解决
解码器的回调,Input Buffer,(OH_AVMemory *data)这块内存是如何分配的 
2758浏览  • 1回复 待解决
HarmonyOS 应用发布时报错 
1098浏览  • 1回复 待解决
HarmonyOS SegmentButton 点击事件回调是哪个? onclick无回调 
1373浏览  • 1回复 待解决
HarmonyOS  native C++ 层传递buffer 到ArkTS 层 
1765浏览  • 1回复 待解决
HarmonyOS 调用相册函数时报错 
1203浏览  • 1回复 待解决
HarmonyOS  加载激励视频时报错 
2606浏览  • 1回复 待解决
HarmonyOS Watch没有回调 
1069浏览  • 1回复 待解决
HarmonyOS 启动rn项目时报错 
1509浏览  • 1回复 待解决
拉起UIAbility时报错16000050 
4040浏览  • 1回复 待解决
HarmonyOS onNewWant未回调 
911浏览  • 1回复 待解决
HarmonyOS Web组件回调 
1576浏览  • 1回复 待解决
希望HarmonyOS提供接口,使移除折叠屏回调的时候可以移除对应回调而不是所有回调 
982浏览  • 1回复 待解决
HarmonyOS 使用flutter创建packages时报错 
1174浏览  • 1回复 待解决
HarmonyOS AVSession.createAVSession时报错6600101 
1043浏览  • 1回复 待解决
HarmonyOS  asset运行add方法时报错 
1661浏览  • 1回复 待解决





















MyHiLog中要判断type为非0的时候直接return,LogType为0表示为当前进程的日志。