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

HarmonyOS
2024-12-16 12:13:35
813浏览
收藏 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;
         }
     );
    
    • 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.

    }

  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;
    
    • 1.
    • 2.
    • 3.
    • 4.
    • 5.
    • 6.
    • 7.
    • 8.
    • 9.
    • 10.
    • 11.
    • 12.
    • 13.
    • 14.
    • 15.
    • 16.
    • 17.
    • 18.

    }

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

    typescript import { queueWork } from 'libqueue_work.so'

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

分享
微博
QQ
微信
回复
2024-12-16 15:10:04


相关问题
HarmonyOS napi 接口线程安全咨询
1120浏览 • 1回复 待解决
获取安全地理位置信息接口的实现
1098浏览 • 1回复 待解决
HarmonyOS 安全地理位置
930浏览 • 1回复 待解决