场景描述:
app应用在native侧调用 系统库/arkts模块的方法。
应用经常会遇到如下的业务诉求:
场景一:系统提供了ArkTS 接口,但未提供对应的NDK接口,当伙伴使用C++ 代码实现业务逻辑时,部分系统能力需要依赖系统ArkTS接口;
场景二: 系统仅提供了ArkTS 异步接口,未提供对应的NDK接口,当伙伴使用C++ 代码实现业务逻辑时,部分系统能力需要依赖系统ArkTS 异步接口;
场景三:伙伴在 TS 侧已定义接口,未实现对应的NDK接口,当伙伴使用C++ 代码实现业务逻辑时,想直接使用已有的TS 接口;
方案描述:
**场景一:**系统提供了ArkTS 接口,但未提供对应的NDK接口,当伙伴使用C++ 代码实现业务逻辑时,部分系统能力需要依赖系统ArkTS接口;
例如: 获取设备的屏幕宽高。
方案:
通过napi_load_module 的方式调用系统模块接口。
核心代码
static napi_value GetDisplaySize(napi_env env, napi_callback_info info) {
// 获取arkts侧的系统库路径
char path[64] = "@ohos.display";
size_t typeLen = 0;
napi_value string;
napi_create_string_utf8(env, path, typeLen, &string);
// 加载系统库
napi_value sysModule;
napi_load_module(env, path, &sysModule);
// 获取系统库中的"getDefaultDisplaySync"方法
napi_value func = nullptr;
napi_get_named_property(env, sysModule, "getDefaultDisplaySync", &func);
napi_value funcResult;
napi_call_function(env, sysModule, func, 0, nullptr, &funcResult);
napi_value widthValue = nullptr;
napi_get_named_property(env, funcResult, "width", &widthValue);
double width;
napi_get_value_double(env, widthValue, &width);
OH_LOG_INFO( LOG_APP, "width: %{public}f", width);
napi_value heightValue = nullptr;
napi_get_named_property(env, funcResult, "height", &heightValue);
double height;
napi_get_value_double(env, heightValue, &height);
OH_LOG_INFO(LOG_APP, "height: %{public}f", height);
// TODO: 业务拿到width 和 height,可以进一步处理具体业务逻辑
return nullptr;
}
运行结果:
场景二:
系统仅提供了ArkTS 异步接口,未提供对应的NDK接口,当伙伴使用C++ 代码实现业务逻辑时,部分系统能力需要依赖系统ArkTS 异步接口;
例如: 如何访问系统定义的异步ArkTS方法。
方案
通过创建线程安全函数的方式 调用系统的异步接口