HarmonyOS同一个线程napi_create_ark_runtime 11次之后必现崩溃

在子线程中napi_create_ark_runtime之后调用js函数(该函数中需要有console.log之类的复杂一些的方法,单纯返回值不会崩溃),调用函数之后使用napi_destroy_ark_runtime销毁,如此反复11次后必现崩溃。代码如下:

// hello.cpp, testReflectRef为在主线程中缓存的 
static napi_ref testReflectRef = NULL; 
 
void testCreate(napi_env env){ 
  bool has_env = true; 
  if(env==NULL){ 
    has_env = false; 
    napi_status ret = napi_create_ark_runtime(&env); 
    if (ret != napi_ok) { 
      return; 
    } 
  } 
  LOG_I("bbb"); 
  napi_value testReflectFunction; 
  napi_get_reference_value(env, testReflectRef, &testReflectFunction); 
 
  napi_value call_result = NULL; 
  napi_call_function(env, NULL, testReflectFunction, 0, NULL, &call_result); 
  int call_result_int = 0; 
  napi_get_value_int32(env, call_result, &call_result_int); 
  LOG_I("call_result:%d", call_result_int); 
  LOG_I("ccc"); 
  if(!has_env){ 
    napi_destroy_ark_runtime(&env); 
  } 
} 
void subThread(){ 
  napi_env env = NULL; 
  //     napi_status ret = napi_create_ark_runtime(&env); 
  for(int i=0;i<100;i++){ 
    testCreate(env); 
  } 
} 
// Utils.ets中被调用的函数 
export function testReflect(){ 
  console.log("testReflect start"); 
  return 3; 
}
HarmonyOS
2024-09-11 11:37:19
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
put_get

testReflectRef为在主线程中缓存的,这个的作用域只能在主线程使用。在子线程中napi_create_ark_runtime之后调用js函数。在子线程中,通过napi_call_function(env, NULL, testReflectFunction, 0, NULL, &call_result);来调用,肯定会崩,变量的作用域不一样。不同线程间,设计到napi_env、napi_value等等的处理,必须在同一个线程中,不能跨线程。请参考使用Node-API接口进行线程安全开发:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/use-napi-thread-safety-0000001774280466-V5

请参考使用Node-API接口进行异步任务开发:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/use-napi-asynchronous-task-V5

子系统中不能使用主线程中保存的napi_ref 。调用js那边的方法,建议都抛到主线程中调用。

分享
微博
QQ
微信
回复
2024-09-11 15:23:53
相关问题
HarmonyOS 多module同时依赖同一个har
590浏览 • 1回复 待解决
同一个HSP中,router.pushUrl中的url问题
294浏览 • 1回复 待解决