使用 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;
}
参考下:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/napi/use-napi-object-wrap.md