往期知识点整理
介绍
部分应用的主要开发语言为C/C++,但是HarmonyOS的部分接口仅以ArkTS的形式暴露,因此需要将ArkTS的接口封装为Native接口。本例以DocumentViewPicker的Select方法为例,提供了Napi封装ArkTS
API的通用方法,本例包含内容如下:
- Native侧与ArkTS侧的相互调用
- Native对象转换为ArkTS对象(包括如何在ArkTS侧调用一般形式的Native方法)
- 线程安全函数的使用
- 等待线程安全函数的执行结果
- 多实例情况下,如何在正确的窗口内执行方法
效果图预览
测试说明:
- 点击"JS线程调用"按钮,从native侧js线程拉起picker
- 点击"PThread线程调用"按钮,从native侧pthread子线程中拉起picker
- 拉起picker后,单击直接选择单个文件,长按可选择多个文件
- 本例在拉起picker时设置了maxSelectNumber=3,最多个选择3个文件
使用说明:
- [建议]在EntryAbility之外调用registryDocumentViewPickerFn方法,避免多实例下的重复注册
- [必须]给每个UIAbility生成唯一的ID属性,可使用generateAbilityID方法
- [必须]在UIAbility的onWindowStageCreate中的windowStage.loadContent的回调中调用addUIContext方法
- [必须]在UIAbility的onWindowStageCreate中的windowStage.loadContent之后调用setTopAbilityID
- [建议]在UIAbility的onWindowStageDestroy中调用removeUIContext方法
实现思路
-
native侧需要主动调用ets侧的代码,需要将ets侧代码注入到native侧,并在注册时创建函数的引用及线程安全函数,并保存当前线程(js线程)的id及env供后续调用时使用
ets侧:
etswrapper.registryDocumentViewPickerFn(documentViewPickerSelect, documentViewPickerSave);
native侧:
NODE_API_CALL(env, napi_create_threadsafe_function(env, args[0], nullptr, selectWork, 0, 1, nullptr, nullptr,
nullptr, tsfn::callJSSelect, &(uniContext->selectTsfn)));
NODE_API_CALL(env, napi_create_threadsafe_function(env, args[1], nullptr, saveWork, 0, 1, nullptr, nullptr,
nullptr, tsfn::callJSSave, &(uniContext->saveTsfn)));
NODE_API_CALL(env, napi_create_reference(env, args[0], 1, &(uniContext->selectRef)