From c09c237dade63ea5c85abf2e8a57ba9e0fa402be Mon Sep 17 00:00:00 2001 From: donglin Date: Fri, 26 Aug 2022 14:15:04 +0800 Subject: [PATCH] add Terminate to PA Signed-off-by: donglin --- .../napi/featureAbility/feature_ability.cpp | 270 ++++++++---------- .../inner/napi_common/napi_common_ability.cpp | 151 ++++++++++ .../inner/napi_common/napi_common_ability.h | 9 + .../napi/particleAbility/particle_ability.cpp | 8 + 4 files changed, 295 insertions(+), 143 deletions(-) diff --git a/frameworks/js/napi/featureAbility/feature_ability.cpp b/frameworks/js/napi/featureAbility/feature_ability.cpp index 7f219cf15a..baa74eb598 100644 --- a/frameworks/js/napi/featureAbility/feature_ability.cpp +++ b/frameworks/js/napi/featureAbility/feature_ability.cpp @@ -458,161 +458,145 @@ napi_value SetResultPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo) napi_value NAPI_TerminateAbility(napi_env env, napi_callback_info info) { HILOG_INFO("%{public}s,called", __func__); - AsyncCallbackInfo *asyncCallbackInfo = CreateAsyncCallbackInfo(env); - if (asyncCallbackInfo == nullptr) { - HILOG_ERROR("%{public}s,asyncCallbackInfo == nullptr", __func__); - return WrapVoidToJS(env); - } - - napi_value ret = TerminateAbilityWrap(env, info, asyncCallbackInfo); - if (ret == nullptr) { - HILOG_ERROR("%{public}s,ret == nullptr", __func__); - if (asyncCallbackInfo != nullptr) { - delete asyncCallbackInfo; - asyncCallbackInfo = nullptr; - } - ret = WrapVoidToJS(env); - } - HILOG_INFO("%{public}s,end", __func__); - return ret; + return NAPI_TerminateAbilityCommon(env, info); } -/** - * @brief TerminateAbility processing function. - * - * @param env The environment that the Node-API call is invoked under. - * @param asyncCallbackInfo Process data asynchronously. - * - * @return Return JS data successfully, otherwise return nullptr. - */ -napi_value TerminateAbilityWrap(napi_env env, napi_callback_info info, AsyncCallbackInfo *asyncCallbackInfo) -{ - HILOG_INFO("%{public}s, asyncCallback.", __func__); - if (asyncCallbackInfo == nullptr) { - HILOG_ERROR("%{public}s, asyncCallbackInfo == nullptr.", __func__); - return nullptr; - } +// /** +// * @brief TerminateAbility processing function. +// * +// * @param env The environment that the Node-API call is invoked under. +// * @param asyncCallbackInfo Process data asynchronously. +// * +// * @return Return JS data successfully, otherwise return nullptr. +// */ +// napi_value TerminateAbilityWrap(napi_env env, napi_callback_info info, AsyncCallbackInfo *asyncCallbackInfo) +// { +// HILOG_INFO("%{public}s, asyncCallback.", __func__); +// if (asyncCallbackInfo == nullptr) { +// HILOG_ERROR("%{public}s, asyncCallbackInfo == nullptr.", __func__); +// return nullptr; +// } - size_t argcAsync = 1; - const size_t argcPromise = 0; - const size_t argCountWithAsync = argcPromise + ARGS_ASYNC_COUNT; - napi_value args[ARGS_MAX_COUNT] = {nullptr}; - napi_value ret = 0; +// size_t argcAsync = 1; +// const size_t argcPromise = 0; +// const size_t argCountWithAsync = argcPromise + ARGS_ASYNC_COUNT; +// napi_value args[ARGS_MAX_COUNT] = {nullptr}; +// napi_value ret = 0; - NAPI_CALL(env, napi_get_cb_info(env, info, &argcAsync, args, nullptr, nullptr)); - if (argcAsync > argCountWithAsync || argcAsync > ARGS_MAX_COUNT) { - HILOG_ERROR("%{public}s, Wrong argument count.", __func__); - return nullptr; - } +// NAPI_CALL(env, napi_get_cb_info(env, info, &argcAsync, args, nullptr, nullptr)); +// if (argcAsync > argCountWithAsync || argcAsync > ARGS_MAX_COUNT) { +// HILOG_ERROR("%{public}s, Wrong argument count.", __func__); +// return nullptr; +// } - if (argcAsync > argcPromise) { - ret = TerminateAbilityAsync(env, args, 0, asyncCallbackInfo); - } else { - ret = TerminateAbilityPromise(env, asyncCallbackInfo); - } - HILOG_INFO("%{public}s, asyncCallback end", __func__); - return ret; -} +// if (argcAsync > argcPromise) { +// ret = TerminateAbilityAsync(env, args, 0, asyncCallbackInfo); +// } else { +// ret = TerminateAbilityPromise(env, asyncCallbackInfo); +// } +// HILOG_INFO("%{public}s, asyncCallback end", __func__); +// return ret; +// } -napi_value TerminateAbilityAsync( - napi_env env, napi_value *args, const size_t argCallback, AsyncCallbackInfo *asyncCallbackInfo) -{ - HILOG_INFO("%{public}s, asyncCallback.", __func__); - if (args == nullptr || asyncCallbackInfo == nullptr) { - HILOG_ERROR("%{public}s, param == nullptr.", __func__); - return nullptr; - } - napi_value resourceName = 0; - NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName)); +// napi_value TerminateAbilityAsync( +// napi_env env, napi_value *args, const size_t argCallback, AsyncCallbackInfo *asyncCallbackInfo) +// { +// HILOG_INFO("%{public}s, asyncCallback.", __func__); +// if (args == nullptr || asyncCallbackInfo == nullptr) { +// HILOG_ERROR("%{public}s, param == nullptr.", __func__); +// return nullptr; +// } +// napi_value resourceName = 0; +// NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName)); - napi_valuetype valuetype = napi_undefined; - NAPI_CALL(env, napi_typeof(env, args[argCallback], &valuetype)); - if (valuetype == napi_function) { - NAPI_CALL(env, napi_create_reference(env, args[argCallback], 1, &asyncCallbackInfo->cbInfo.callback)); - } +// napi_valuetype valuetype = napi_undefined; +// NAPI_CALL(env, napi_typeof(env, args[argCallback], &valuetype)); +// if (valuetype == napi_function) { +// NAPI_CALL(env, napi_create_reference(env, args[argCallback], 1, &asyncCallbackInfo->cbInfo.callback)); +// } - NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, - [](napi_env env, void *data) { - HILOG_INFO("NAPI_TerminateAbility, worker pool thread execute."); - AsyncCallbackInfo *asyncCallbackInfo = static_cast(data); - if (asyncCallbackInfo->ability != nullptr) { - asyncCallbackInfo->ability->TerminateAbility(); - } else { - HILOG_ERROR("NAPI_TerminateAbility, ability == nullptr"); - } - HILOG_INFO("NAPI_TerminateAbility, worker pool thread execute end."); - }, - [](napi_env env, napi_status status, void *data) { - HILOG_INFO("NAPI_TerminateAbility, main event thread complete."); - AsyncCallbackInfo *asyncCallbackInfo = static_cast(data); - napi_value callback = 0; - napi_value undefined = 0; - napi_value result[ARGS_TWO] = {0}; - napi_value callResult = 0; - napi_get_undefined(env, &undefined); - result[PARAM0] = GetCallbackErrorValue(env, NO_ERROR); - napi_get_null(env, &result[PARAM1]); - napi_get_reference_value(env, asyncCallbackInfo->cbInfo.callback, &callback); - napi_call_function(env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult); +// NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, +// [](napi_env env, void *data) { +// HILOG_INFO("NAPI_TerminateAbility, worker pool thread execute."); +// AsyncCallbackInfo *asyncCallbackInfo = static_cast(data); +// if (asyncCallbackInfo->ability != nullptr) { +// asyncCallbackInfo->ability->TerminateAbility(); +// } else { +// HILOG_ERROR("NAPI_TerminateAbility, ability == nullptr"); +// } +// HILOG_INFO("NAPI_TerminateAbility, worker pool thread execute end."); +// }, +// [](napi_env env, napi_status status, void *data) { +// HILOG_INFO("NAPI_TerminateAbility, main event thread complete."); +// AsyncCallbackInfo *asyncCallbackInfo = static_cast(data); +// napi_value callback = 0; +// napi_value undefined = 0; +// napi_value result[ARGS_TWO] = {0}; +// napi_value callResult = 0; +// napi_get_undefined(env, &undefined); +// result[PARAM0] = GetCallbackErrorValue(env, NO_ERROR); +// napi_get_null(env, &result[PARAM1]); +// napi_get_reference_value(env, asyncCallbackInfo->cbInfo.callback, &callback); +// napi_call_function(env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult); - if (asyncCallbackInfo->cbInfo.callback != nullptr) { - napi_delete_reference(env, asyncCallbackInfo->cbInfo.callback); - } - napi_delete_async_work(env, asyncCallbackInfo->asyncWork); - delete asyncCallbackInfo; - HILOG_INFO("NAPI_TerminateAbility, main event thread complete end."); - }, - (void *)asyncCallbackInfo, - &asyncCallbackInfo->asyncWork)); - NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork)); - napi_value result = 0; - NAPI_CALL(env, napi_get_null(env, &result)); - HILOG_INFO("%{public}s, asyncCallback end", __func__); - return result; -} +// if (asyncCallbackInfo->cbInfo.callback != nullptr) { +// napi_delete_reference(env, asyncCallbackInfo->cbInfo.callback); +// } +// napi_delete_async_work(env, asyncCallbackInfo->asyncWork); +// delete asyncCallbackInfo; +// HILOG_INFO("NAPI_TerminateAbility, main event thread complete end."); +// }, +// (void *)asyncCallbackInfo, +// &asyncCallbackInfo->asyncWork)); +// NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork)); +// napi_value result = 0; +// NAPI_CALL(env, napi_get_null(env, &result)); +// HILOG_INFO("%{public}s, asyncCallback end", __func__); +// return result; +// } -napi_value TerminateAbilityPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo) -{ - HILOG_INFO("%{public}s, promise.", __func__); - if (asyncCallbackInfo == nullptr) { - HILOG_ERROR("TerminateAbilityPromise, param == nullptr."); - return nullptr; - } - napi_value resourceName = 0; - NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName)); - napi_deferred deferred; - napi_value promise = 0; - NAPI_CALL(env, napi_create_promise(env, &deferred, &promise)); +// napi_value TerminateAbilityPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo) +// { +// HILOG_INFO("%{public}s, promise.", __func__); +// if (asyncCallbackInfo == nullptr) { +// HILOG_ERROR("TerminateAbilityPromise, param == nullptr."); +// return nullptr; +// } +// napi_value resourceName = 0; +// NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName)); +// napi_deferred deferred; +// napi_value promise = 0; +// NAPI_CALL(env, napi_create_promise(env, &deferred, &promise)); - asyncCallbackInfo->deferred = deferred; +// asyncCallbackInfo->deferred = deferred; - NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, - [](napi_env env, void *data) { - HILOG_INFO("NAPI_TerminateAbility, worker pool thread execute."); - AsyncCallbackInfo *asyncCallbackInfo = static_cast(data); - if (asyncCallbackInfo->ability != nullptr) { - asyncCallbackInfo->ability->TerminateAbility(); - } else { - HILOG_INFO("NAPI_TerminateAbility, ability == nullptr"); - } - HILOG_INFO("NAPI_TerminateAbility, worker pool thread execute end."); - }, - [](napi_env env, napi_status status, void *data) { - HILOG_INFO("NAPI_TerminateAbility, main event thread complete."); - AsyncCallbackInfo *asyncCallbackInfo = static_cast(data); - napi_value result = 0; - napi_get_null(env, &result); - napi_resolve_deferred(env, asyncCallbackInfo->deferred, result); - napi_delete_async_work(env, asyncCallbackInfo->asyncWork); - delete asyncCallbackInfo; - HILOG_INFO("NAPI_TerminateAbility, main event thread complete end."); - }, - (void *)asyncCallbackInfo, - &asyncCallbackInfo->asyncWork)); - NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork)); - HILOG_INFO("%{public}s, promise end", __func__); - return promise; -} +// NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, +// [](napi_env env, void *data) { +// HILOG_INFO("NAPI_TerminateAbility, worker pool thread execute."); +// AsyncCallbackInfo *asyncCallbackInfo = static_cast(data); +// if (asyncCallbackInfo->ability != nullptr) { +// asyncCallbackInfo->ability->TerminateAbility(); +// } else { +// HILOG_INFO("NAPI_TerminateAbility, ability == nullptr"); +// } +// HILOG_INFO("NAPI_TerminateAbility, worker pool thread execute end."); +// }, +// [](napi_env env, napi_status status, void *data) { +// HILOG_INFO("NAPI_TerminateAbility, main event thread complete."); +// AsyncCallbackInfo *asyncCallbackInfo = static_cast(data); +// napi_value result = 0; +// napi_get_null(env, &result); +// napi_resolve_deferred(env, asyncCallbackInfo->deferred, result); +// napi_delete_async_work(env, asyncCallbackInfo->asyncWork); +// delete asyncCallbackInfo; +// HILOG_INFO("NAPI_TerminateAbility, main event thread complete end."); +// }, +// (void *)asyncCallbackInfo, +// &asyncCallbackInfo->asyncWork)); +// NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork)); +// HILOG_INFO("%{public}s, promise end", __func__); +// return promise; +// } /** * @brief Checks whether the main window of this ability has window focus. diff --git a/frameworks/js/napi/inner/napi_common/napi_common_ability.cpp b/frameworks/js/napi/inner/napi_common/napi_common_ability.cpp index 762cc9f2a8..776b791f25 100644 --- a/frameworks/js/napi/inner/napi_common/napi_common_ability.cpp +++ b/frameworks/js/napi/inner/napi_common/napi_common_ability.cpp @@ -4651,5 +4651,156 @@ napi_value NAPI_CancelBackgroundRunningCommon(napi_env env, napi_callback_info i HILOG_INFO("%{public}s end.", __func__); return ret; } + +napi_value TerminateAbilityWrap(napi_env env, napi_callback_info info, AsyncCallbackInfo *asyncCallbackInfo) +{ + HILOG_INFO("%{public}s, asyncCallback.", __func__); + if (asyncCallbackInfo == nullptr) { + HILOG_ERROR("%{public}s, asyncCallbackInfo == nullptr.", __func__); + return nullptr; + } + + size_t argcAsync = 1; + const size_t argcPromise = 0; + const size_t argCountWithAsync = argcPromise + ARGS_ASYNC_COUNT; + napi_value args[ARGS_MAX_COUNT] = {nullptr}; + napi_value ret = 0; + + NAPI_CALL(env, napi_get_cb_info(env, info, &argcAsync, args, nullptr, nullptr)); + if (argcAsync > argCountWithAsync || argcAsync > ARGS_MAX_COUNT) { + HILOG_ERROR("%{public}s, Wrong argument count.", __func__); + return nullptr; + } + + if (argcAsync > argcPromise) { + ret = TerminateAbilityAsync(env, args, 0, asyncCallbackInfo); + } else { + ret = TerminateAbilityPromise(env, asyncCallbackInfo); + } + HILOG_INFO("%{public}s, asyncCallback end", __func__); + return ret; +} + +napi_value TerminateAbilityAsync( + napi_env env, napi_value *args, const size_t argCallback, AsyncCallbackInfo *asyncCallbackInfo) +{ + HILOG_INFO("%{public}s, asyncCallback.", __func__); + if (args == nullptr || asyncCallbackInfo == nullptr) { + HILOG_ERROR("%{public}s, param == nullptr.", __func__); + return nullptr; + } + napi_value resourceName = 0; + NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName)); + + napi_valuetype valuetype = napi_undefined; + NAPI_CALL(env, napi_typeof(env, args[argCallback], &valuetype)); + if (valuetype == napi_function) { + NAPI_CALL(env, napi_create_reference(env, args[argCallback], 1, &asyncCallbackInfo->cbInfo.callback)); + } + + NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, + [](napi_env env, void *data) { + HILOG_INFO("NAPI_TerminateAbility, worker pool thread execute."); + AsyncCallbackInfo *asyncCallbackInfo = static_cast(data); + if (asyncCallbackInfo->ability != nullptr) { + asyncCallbackInfo->ability->TerminateAbility(); + } else { + HILOG_ERROR("NAPI_TerminateAbility, ability == nullptr"); + } + HILOG_INFO("NAPI_TerminateAbility, worker pool thread execute end."); + }, + [](napi_env env, napi_status status, void *data) { + HILOG_INFO("NAPI_TerminateAbility, main event thread complete."); + AsyncCallbackInfo *asyncCallbackInfo = static_cast(data); + napi_value callback = 0; + napi_value undefined = 0; + napi_value result[ARGS_TWO] = {0}; + napi_value callResult = 0; + napi_get_undefined(env, &undefined); + result[PARAM0] = GetCallbackErrorValue(env, NO_ERROR); + napi_get_null(env, &result[PARAM1]); + napi_get_reference_value(env, asyncCallbackInfo->cbInfo.callback, &callback); + napi_call_function(env, undefined, callback, ARGS_TWO, &result[PARAM0], &callResult); + + if (asyncCallbackInfo->cbInfo.callback != nullptr) { + napi_delete_reference(env, asyncCallbackInfo->cbInfo.callback); + } + napi_delete_async_work(env, asyncCallbackInfo->asyncWork); + delete asyncCallbackInfo; + HILOG_INFO("NAPI_TerminateAbility, main event thread complete end."); + }, + (void *)asyncCallbackInfo, + &asyncCallbackInfo->asyncWork)); + NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork)); + napi_value result = 0; + NAPI_CALL(env, napi_get_null(env, &result)); + HILOG_INFO("%{public}s, asyncCallback end", __func__); + return result; +} + +napi_value TerminateAbilityPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo) +{ + HILOG_INFO("%{public}s, promise.", __func__); + if (asyncCallbackInfo == nullptr) { + HILOG_ERROR("TerminateAbilityPromise, param == nullptr."); + return nullptr; + } + napi_value resourceName = 0; + NAPI_CALL(env, napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &resourceName)); + napi_deferred deferred; + napi_value promise = 0; + NAPI_CALL(env, napi_create_promise(env, &deferred, &promise)); + + asyncCallbackInfo->deferred = deferred; + + NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, + [](napi_env env, void *data) { + HILOG_INFO("NAPI_TerminateAbility, worker pool thread execute."); + AsyncCallbackInfo *asyncCallbackInfo = static_cast(data); + if (asyncCallbackInfo->ability != nullptr) { + asyncCallbackInfo->ability->TerminateAbility(); + } else { + HILOG_INFO("NAPI_TerminateAbility, ability == nullptr"); + } + HILOG_INFO("NAPI_TerminateAbility, worker pool thread execute end."); + }, + [](napi_env env, napi_status status, void *data) { + HILOG_INFO("NAPI_TerminateAbility, main event thread complete."); + AsyncCallbackInfo *asyncCallbackInfo = static_cast(data); + napi_value result = 0; + napi_get_null(env, &result); + napi_resolve_deferred(env, asyncCallbackInfo->deferred, result); + napi_delete_async_work(env, asyncCallbackInfo->asyncWork); + delete asyncCallbackInfo; + HILOG_INFO("NAPI_TerminateAbility, main event thread complete end."); + }, + (void *)asyncCallbackInfo, + &asyncCallbackInfo->asyncWork)); + NAPI_CALL(env, napi_queue_async_work(env, asyncCallbackInfo->asyncWork)); + HILOG_INFO("%{public}s, promise end", __func__); + return promise; +} + +napi_value NAPI_TerminateAbilityCommon(napi_env env, napi_callback_info info) +{ + HILOG_INFO("%{public}s,called", __func__); + AsyncCallbackInfo *asyncCallbackInfo = CreateAsyncCallbackInfo(env); + if (asyncCallbackInfo == nullptr) { + HILOG_ERROR("%{public}s,asyncCallbackInfo == nullptr", __func__); + return WrapVoidToJS(env); + } + + napi_value ret = TerminateAbilityWrap(env, info, asyncCallbackInfo); + if (ret == nullptr) { + HILOG_ERROR("%{public}s,ret == nullptr", __func__); + if (asyncCallbackInfo != nullptr) { + delete asyncCallbackInfo; + asyncCallbackInfo = nullptr; + } + ret = WrapVoidToJS(env); + } + HILOG_INFO("%{public}s,end", __func__); + return ret; +} } // namespace AppExecFwk } // namespace OHOS diff --git a/frameworks/js/napi/inner/napi_common/napi_common_ability.h b/frameworks/js/napi/inner/napi_common/napi_common_ability.h index 04aaa10edd..0ba027637e 100644 --- a/frameworks/js/napi/inner/napi_common/napi_common_ability.h +++ b/frameworks/js/napi/inner/napi_common/napi_common_ability.h @@ -216,6 +216,15 @@ napi_value GetContinueAbilityOptionsDeviceID( bool UnwrapAbilityStartSetting(napi_env env, napi_value param, AAFwk::AbilityStartSetting &setting); +napi_value NAPI_TerminateAbilityCommon(napi_env env, napi_callback_info info); + +napi_value TerminateAbilityWrap(napi_env env, napi_callback_info info, AsyncCallbackInfo *asyncCallbackInfo); + +napi_value TerminateAbilityAsync( + napi_env env, napi_value *args, const size_t argCallback, AsyncCallbackInfo *asyncCallbackInfo); + +napi_value TerminateAbilityPromise(napi_env env, AsyncCallbackInfo *asyncCallbackInfo); + class NAPIAbilityConnection : public AAFwk::AbilityConnectionStub { public: void OnAbilityConnectDone( diff --git a/frameworks/js/napi/particleAbility/particle_ability.cpp b/frameworks/js/napi/particleAbility/particle_ability.cpp index cfb8d70afe..ef32eb697e 100644 --- a/frameworks/js/napi/particleAbility/particle_ability.cpp +++ b/frameworks/js/napi/particleAbility/particle_ability.cpp @@ -209,6 +209,12 @@ napi_value NAPI_PACancelBackgroundRunning(napi_env env, napi_callback_info info) return NAPI_CancelBackgroundRunningCommon(env, info); } +napi_value NAPI_PATerminateAbility(napi_env env, napi_callback_info info) +{ + HILOG_INFO("%{public}s,called", __func__); + return NAPI_TerminateAbilityCommon(env, info); +} + /** * @brief ParticleAbility NAPI module registration. * @@ -234,6 +240,8 @@ napi_value ParticleAbilityInit(napi_env env, napi_value exports) DECLARE_NAPI_FUNCTION("acquireDataAbilityHelper", NAPI_PAAcquireDataAbilityHelper), DECLARE_NAPI_FUNCTION("startBackgroundRunning", NAPI_PAStartBackgroundRunning), DECLARE_NAPI_FUNCTION("cancelBackgroundRunning", NAPI_PACancelBackgroundRunning), + DECLARE_NAPI_FUNCTION("terminateAbility", NAPI_PATerminateAbility), + DECLARE_NAPI_FUNCTION("terminateSelf", NAPI_PATerminateAbility), }; napi_define_properties(env, exports, sizeof(properties) / sizeof(properties[0]), properties);