场景描述:
app应用在native侧调用 系统库/arkts模块的方法。
应用经常会遇到如下的业务诉求:
场景一:系统提供了ArkTS 接口,但未提供对应的NDK接口,当伙伴使用C++ 代码实现业务逻辑时,部分系统能力需要依赖系统ArkTS接口。
场景二:系统仅提供了ArkTS 异步接口,未提供对应的NDK接口,当伙伴使用C++ 代码实现业务逻辑时,部分系统能力需要依赖系统ArkTS 异步接口。
场景三:伙伴在 TS 侧已定义接口,未实现对应的NDK接口,当伙伴使用C++ 代码实现业务逻辑时,想直接使用已有的TS 接口。
方案描述:
场景一:
系统提供了ArkTS 接口,但未提供对应的NDK接口,当伙伴使用C++ 代码实现业务逻辑时,部分系统能力需要依赖系统ArkTS接口。
例如: 获取设备的屏幕宽高。
方案:
通过napi_load_module 的方式调用系统模块接口。

核心代码
运行结果:

场景二:
系统仅提供了ArkTS 异步接口,未提供对应的NDK接口,当伙伴使用C++ 代码实现业务逻辑时,部分系统能力需要依赖系统ArkTS 异步接口。
例如: 如何访问系统定义的异步ArkTS方法。
方案
通过创建线程安全函数的方式 调用系统的异步接口。

核心代码: 回调到JS层。
static void CallJs(napi_env env, napi_value jsCb, void *context, void *data) {
if (env == nullptr) {
return;
}
napi_value undefined = nullptr;
napi_value promise = nullptr;
char str[] = "wlan0";
napi_value sysModule;
napi_load_module(env, "@ohos.net.statistics", &sysModule);
napi_value param;
napi_create_string_utf8(env, str, NAPI_AUTO_LENGTH, ¶m);
napi_call_function(env, sysModule, jsCb, 1, ¶m, &promise);
napi_value thenFunc = nullptr;
if (napi_get_named_property(env, promise, "then", &thenFunc) != napi_ok) {
return;
}
napi_value resolvedCallback;
napi_value rejectedCallback;
napi_create_function(env, "resolvedCallback", NAPI_AUTO_LENGTH, ResolvedCallback, data, &resolvedCallback);
napi_create_function(env, "rejectedCallback", NAPI_AUTO_LENGTH, RejectedCallback, data, &rejectedCallback);
napi_value argv[2] = {resolvedCallback, rejectedCallback};
napi_call_function(env, promise, thenFunc, 2, argv, nullptr);
}
static void ExecuteWork(napi_env env, void *data) {
CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
std::promise<double> promise;
auto future = promise.get_future();
napi_call_threadsafe_function(callbackData->tsfn, &promise, napi_tsfn_nonblocking);
try {
auto result = future.get();
OH_LOG_INFO(LOG_APP, "getIfaceRxBytes Result from JS %{public}f", result);
} catch (const std::exception &e) {
}
}
static void WorkComplete(napi_env env, napi_status status, void *data) {
CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
napi_release_threadsafe_function(callbackData->tsfn, napi_tsfn_release);
napi_delete_async_work(env, callbackData->work);
callbackData->tsfn = nullptr;
callbackData->work = nullptr;
}
static napi_value CallAsyncFunc(napi_env env, napi_callback_info info) {
size_t argc = 1;
napi_value jsCb = nullptr;
CallbackData *callbackData = nullptr;
napi_get_cb_info(env, info, &argc, &jsCb, nullptr, reinterpret_cast<void **>(&callbackData));
napi_value sysModule;
napi_load_module(env, "@ohos.net.statistics", &sysModule);
napi_value getIfaceRxBytesFunc ;
napi_get_named_property(env, sysModule, "getIfaceRxBytes", &getIfaceRxBytesFunc);
napi_value resourceName = nullptr;
napi_create_string_utf8(env, "CallAsyncFunc", NAPI_AUTO_LENGTH, &resourceName);
napi_create_threadsafe_function(env, getIfaceRxBytesFunc, nullptr, resourceName, 0, 1, callbackData, nullptr, callbackData, CallJs,
&callbackData->tsfn);
napi_create_async_work(env, nullptr, resourceName, ExecuteWork, WorkComplete, callbackData, &callbackData->work);
napi_queue_async_work(env, callbackData->work);
return nullptr;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
运行结果

场景三:
伙伴在 ArkTS/TS 侧已定义接口,当伙伴使用C++ 代码实现业务逻辑时,想直接使用已有的TS 接口;
例如: 如何调用自定义的 ArkTS/TS方法;
方案

核心代码
步骤一:ObjectUtil.ts 导出相关接口。
步骤二:必须在 build-profile.json5添加ets文件配置。
步骤三:在native 获取ets 模块导出的变量。
步骤四:获取方法并调用demo示例(获取/ets/common/ObjectUtil 的isNull方法,并调用isNull方法判断一个对象是否为null)。
你好,请问你那边用的是什么版本的,我这里napi_call_function方法找不到