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
      
        赞
        
 收藏 0
 回答 1
 
        待解决
        
相关问题
 HarmonyOS 调用napi_create_ark_runtime创建env失败 
1196浏览  • 1回复 待解决
HarmonyOS在C++线程上调用napi_create_ark_runtime,如何调用到js层的对象 
1736浏览  • 1回复 待解决
HarmonyOS同一份代码,同一个版本的编译器,同一个手机,不同的电脑。代码运行崩溃 
2092浏览  • 2回复 待解决
Mindspore Lite和onnx runtime推理同一个模型,输入一样,输出结果不同 
2371浏览  • 1回复 待解决
同一个正则同一个文本 函数exec为什么经常出现异常 
2765浏览  • 1回复 待解决
同一个应用中,多个线程或者多个进程访问同一个关系数据库,需要考虑并发的问题吗? 
1462浏览  • 1回复 待解决
HarmonyOS  依赖同一个组件,不同版本,编译后,出现引用多份同一个组件的情况 
1884浏览  • 1回复 待解决
OpenGL同一个上下文在多线程中使用问题 
2475浏览  • 1回复 待解决
如何指定多个异步任务在同一个辅助线程内执行 
1750浏览  • 1回复 待解决
HarmonyOS  多module同时依赖同一个har 
2216浏览  • 1回复 待解决
ArkTS线程模型中是否是每个线程跑一个runtime实例 
3086浏览  • 1回复 待解决
同一主题的HarmonyOS应用 如何使用同一个证书上架 
1067浏览  • 1回复 待解决
HarmonyOS RichText组件,同一个页面中使用两次,会有一个不显示。同时不能设置字体大小 
947浏览  • 1回复 待解决
如何实现在同一个UIAbility实例传递事件 
1649浏览  • 1回复 待解决
HarmonyOS 如何在多个taskpool中操作同一个对象? 
1270浏览  • 1回复 待解决
HarmonyOS 在主线程和子线程中需要操作同一个队列,如何保证这个队列是线程安全的。 
1003浏览  • 1回复 待解决
元服务如何与HarmonyOS应用使用同一个证书 
954浏览  • 1回复 待解决
一个应用内的所有ArkWeb是共用同一个render进程吗? 
1912浏览  • 1回复 待解决
同一个控件如何同时监听点击和长按事件? 
1617浏览  • 3回复 待解决
WebView与UIAbility是都运行在同一个进程? 
1871浏览  • 1回复 待解决
HarmonyOS 播放专辑一段时间必现crash 
1151浏览  • 1回复 待解决
HarmonyOS 多module打包进同一个har中的问题 
1244浏览  • 1回复 待解决
napi_create_async_work 接口创建的线程数量,最多能有多少个,是否是一个进程上限8个? 
1084浏览  • 1回复 待解决
同一个Navigation下非根页面不会执行onpageshow方法 
3318浏览  • 1回复 待解决





















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那边的方法,建议都抛到主线程中调用。