HarmonyOS 使用 napi 对接 C++ class 的 ArkTS 类,在 new ClassXXX\(\) 的时候报错 TypeError Constructor is false?

使用 napi 对接 C++ class 的 ArtTs 类,在 new ClassXXX() 的时候报错 TypeError Constructor is false

Reason:TypeError

Error name:TypeError

Error message:Constructor is false

SourceCode:

this.animator = new JPAGAnimator();

napi_value JPAGAnimator::Constructor(napi_env env, napi_callback_info info) {
  napi_value jsAnimator = nullptr;
  size_t argc = 0;
  napi_value args[1] = {0};
  napi_get_cb_info(env, info, &argc, args, &jsAnimator, nullptr);
  auto cAnimator = std::make_shared<JPAGAnimator>();
  cAnimator->pagAnimator = PAGAnimator::MakeFrom(cAnimator);
  cAnimator->pagAnimator->setRepeatCount(-1);
  napi_wrap(
    env, jsAnimator, cAnimator.get(),
    [](napi_env, void* finalize_data, void*) {
    JPAGAnimator* animator = static_cast<JPAGAnimator*>(finalize_data);
    delete animator;
  },
  nullptr, nullptr);
  return jsAnimator;
}

bool JPAGAnimator::Init(napi_env env, napi_value exports) {
  napi_property_descriptor classProp[] = {};

  auto status = DefineClass(env, exports, ClassName(), sizeof(classProp) / sizeof(classProp[0]),
    classProp, Constructor, "");
  return status == napi_ok;
}


napi_status DefineClass(napi_env env, napi_value exports, const std::string& utf8name,
size_t propertyCount, const napi_property_descriptor* properties,
napi_callback constructor, const std::string& parentName) {
  napi_value classConstructor;
  auto status = napi_define_class(env, utf8name.c_str(), utf8name.length(), constructor, nullptr,
    propertyCount, properties, &classConstructor);
  if (status != napi_status::napi_ok) {
    LOGE("DefineClass napi_define_class failed:%d", status);
    return status;
  }
  status = napi_set_named_property(env, exports, utf8name.c_str(), classConstructor);
  if (status != napi_status::napi_ok) {
    LOGE("DefineClass napi_set_named_property failed:%d", status);
    return status;
  }
  SetConstructor(env, classConstructor, utf8name);
  return status;
}


bool SetConstructor(napi_env env, napi_value constructor, const std::string& name) {
  if (env == nullptr || constructor == nullptr || name.empty()) {
    return false;
  }
  if (ConstructorRefMap.find(name) != ConstructorRefMap.end()) {
    napi_delete_reference(env, ConstructorRefMap.at(name));
    ConstructorRefMap.erase(name);
  }
  napi_ref ref;
  napi_create_reference(env, constructor, 1, &ref);
  ConstructorRefMap[name] = ref;
  return true;
}
阅读 574
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进