#鸿蒙通关秘籍#如何在非ArkTS线程安全地使用NAPI接口?

HarmonyOS
2天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
女巫的黑猫

在非ArkTS线程中安全使用NAPI接口,可以通过以下步骤确保操作的线程安全性:

  1. 定义回调上下文信息:保存参数的上下文环境和回调引用。

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

  2. 在自定义线程中执行任务:定义一个函数进行异步任务处理。

    cpp void StartThread(CallbackContext* context) { uv_loop_s* loop = nullptr; napi_get_uv_event_loop(context->env, &loop);

     uv_work_t* work = new uv_work_t;
     context->retData = 1;
     work->data = context;
    
     uv_queue_work(
         loop,
         work,
         [](uv_work_t* work) {},
         [](uv_work_t* work, int status) {
             CallbackContext* context = reinterpret_cast<CallbackContext*>(work->data);
             napi_handle_scope scope = nullptr;
             napi_open_handle_scope(context->env, &scope);
             if (scope == nullptr) {
                 return;
             }
    
             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);
             napi_close_handle_scope(context->env, scope);
    
             delete work;
             delete context;
         }
     );
    

    }

  3. 接口的实现及参数处理:在接口实现中进行参数检查和环境设置。

    cpp 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;
     }
    
     auto asyncContext = new CallbackContext();
     asyncContext->env = env;
     napi_create_reference(env, argv[0], 1, &asyncContext->callbackRef);
     std::thread testThread(StartThread, asyncContext);
     testThread.detach();
    
     return nullptr;
    

    }

  4. 在ArkTS中调用:使用该功能进行操作。

    typescript import { queueWork } from 'libqueue_work.so'

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

分享
微博
QQ
微信
回复
2天前
相关问题
HarmonyOS napi 接口线程安全咨询
332浏览 • 1回复 待解决
获取安全地理位置信息接口的实现
380浏览 • 1回复 待解决
ArkTs线程方案如何保证线程安全
2568浏览 • 2回复 待解决