当前位置:   article > 正文

鸿蒙HarmonyOS应用开发之在非ArkTS线程中回调ArkTS接口_arkts 自定义回调接口

arkts 自定义回调接口

target_link_libraries(queue_work PUBLIC libace_napi.z.so libhilog_ndk.z.so libuv.so)


**模块注册**



  • 1
  • 2
  • 3
  • 4
  • 5

// queue_work.cpp
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
napi_property_descriptor desc[] = {
{ “queueWork”, nullptr, QueueWork, nullptr, nullptr, nullptr, napi_default, nullptr }
};
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
EXTERN_C_END

static napi_module nativeModule = {
.nm_version = 1,
.nm_flags = 0,
.nm_filename = nullptr,
.nm_register_func = Init,
.nm_modname = “queue_work”,
.nm_priv = nullptr,
.reserved = { 0 },
};

extern “C” attribute((constructor)) void RegisterQueueWorkModule()
{
napi_module_register(&nativeModule);
}


2. 获取env对应的loop,并抛任务到ArkTS线程



  • 1
  • 2
  • 3
  • 4
  • 5

// queue_work.cpp
#include

#include “napi/native_api.h”
#include “uv.h”

struct CallbackContext {
napi_env env = nullptr;
napi_ref callbackRef = nullptr;
int32_t retData = 0;
};

void StartThread(CallbackContext* context)
{
// 从env中获取对应的ArkTS线程的loop,此处的env需要在注册JS回调时保存下来。
uv_loop_s* loop = nullptr;
napi_get_uv_event_loop(context->env, &loop);

// 创建uv_work_t用于传递私有数据,注意回调完成后需要释放内存,此处省略生成回传数据的逻辑,传回int类型1。
uv_work_t* work = new uv_work_t;
context->retData = 1;
work->data = context;

// 抛任务到ArkTS线程
uv_queue_work(
    loop,
    work,
    // work_cb 此回调在另一个普通线程中执行,用于处理异步或者耗时任务,回调执行完后执行下面的回调。本示例中无需执行任务。
    [](uv_work_t* work) {},
    // after_work_cb 此回调在env对应的ArkTS线程中执行。
    [](uv_work_t* work, int status) {
        CallbackContext* context = reinterpret_cast<CallbackContext*>(work->data);
        napi_handle_scope scope = nullptr;
        // 打开handle scope用于管理napi_value的生命周期,否则会内存泄露。
        napi_open_handle_scope(context->env, &scope);
        if (scope == nullptr) {
            return;
        }

        // 回调ArkTS函数
        napi_value callback = nullptr;
        napi_get_reference_value(context->env, context->callbackRef, &callback);
        napi_value retArg;
        napi_create_int32(context->env, context->retData, &retArg);
        napi_value ret;
        napi_call_function(context->env, nullptr, callback, 1, &retArg, &ret);
        napi_delete_reference(context->env, context->callbackRef);

        // 关闭handle scope释放napi_value
        napi_close_handle_scope(context->env, scope);

        if (work != nullptr) {
            delete work;
        }
        delete context;
    }
);
  • 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

}

static napi_value QueueWork(napi_env env, napi_callback_info info)
{
size_t argc = 1;
napi_value argv[1] = {nullptr};
napi_value thisVar = nullptr;
void *data = nullptr;
napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);

// 参数检查
if (argc < 1) {
    napi_throw_error(env, "ParameterError", "one param expected");
    return nullptr;
}
napi_valuetype valueType = napi_undefined;
napi_typeof(env, argv[0], &valueType);
if (valueType != napi_function) {
    napi_throw_error(env, "ParameterError", "function expected");
    return nullptr;
}

// 保存env和回调函数,以便后续回调
auto asyncContext = new CallbackContext();
asyncContext->env = env;
napi_create_reference(env, argv[0], 1, &asyncContext->callbackRef);
// 模拟抛到非js线程执行逻辑
std::thread testThread(StartThread, asyncContext);
testThread.detach();

return nullptr;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

}


3. ArkTS侧示例代码



  • 1
  • 2
  • 3
  • 4
  • 5

import { queueWork } from ‘libqueue_work.so’

queueWork((result: number) => {
console.log("result = " + result);
});


**为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:[`https://qr21.cn/FV7h05`]( )**


### 《鸿蒙开发学习手册》:


#### **如何快速入门:[`https://qr21.cn/FV7h05`]( )**


1. 基本概念
2. 构建第一个ArkTS应用
3. ……


![](https://img-blog.csdnimg.cn/img_convert/afd6b98a09014e557566dec0fd065c41.webp?x-oss-process=image/format,png)


#### **开发基础知识:[`https://qr21.cn/FV7h05`]( )**


1. 应用基础知识
2. 配置文件
3. 应用数据管理
4. 应用安全管理
5. 应用隐私保护
6. 三方应用调用管控机制
7. 资源分类与访问
8. 学习ArkTS语言
9. ……


![](https://img-blog.csdnimg.cn/img_convert/c02d1bcf9201e3d3d8baf3b812f8e370.webp?x-oss-process=image/format,png)


#### **基于ArkTS 开发:[`https://qr21.cn/FV7h05`]( )**


1. Ability开发
2. UI开发
3. 公共事件与通知
4. 窗口管理
5. 媒体
6. 安全


**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年HarmonyOS鸿蒙开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/025f279ad65c296f6f12803f2eee0e41.png)
![img](https://img-blog.csdnimg.cn/img_convert/d0697d2539bdb8ce11097b579691870a.png)
![img](https://img-blog.csdnimg.cn/img_convert/82fa8e33a0f750cd3d9c60608c2ffa38.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上HarmonyOS鸿蒙开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)**
![img](https://img-blog.csdnimg.cn/img_convert/e81000d02c40ee90a33ef3b3a94d9962.png)

**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

频,并且会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)**
[外链图片转存中...(img-VSrCcnBN-1712920291829)]

**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/840479
推荐阅读
相关标签
  

闽ICP备14008679号