赞
踩
target_link_libraries(queue_work PUBLIC libace_napi.z.so libhilog_ndk.z.so libuv.so)
**模块注册**
// 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线程
// 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; } );
}
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;
}
3. ArkTS侧示例代码
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行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。