有没有获取HarmonyOS鸿蒙Next最新napi_env的方法
有没有获取HarmonyOS鸿蒙Next最新napi_env的方法
我这边有个场景,native在非常底层的地方会调用arkts方法,我没有办法napi_env一层一层传递下来,直接缓存的话会有crash
下面是crash栈
相关词:保存napi_env,使用napi出现崩溃问题,保存napi_value
#00 /system/lib/platformsdk/libark_jsruntime.so(panda::JSValueRef::IsFunction)
#01 /system/lib/platformsdk/libace_napi.z.so(napi_call_function)
#02 /data/storage/el1/bundle/libs/arm/libentry.so
...
更多关于有没有获取HarmonyOS鸿蒙Next最新napi_env的方法的实战教程也可以访问 https://www.itying.com/category-93-b0.html
首先说说保存napi_env这件事情:
napi没有提供直接获取napi_env的能力,只能通过传递一层一层传下来。我看文档中其实也不推荐保存napi_env,我理解有两个原因,其一,napi_env退出时候如果没有被使用方感知到,很容易出现use-after-free问题;其二napi_env和js线程时强绑定的,如果napi_env放在其他js线程使用,就会有多线程安全问题。
napi_env禁止缓存的原因是什么-NDK开发-NDK开发-应用框架开发-开发 - 华为HarmonyOS开发者
方舟运行时检测-线程问题检测-运行态检测-稳定性检测-稳定性-应用质量 - 华为HarmonyOS开发者
我理解,如果你要强行保存env,就一定要感知env是否退出,用napi_add_env_cleanup_hook的回调去感知。并且还要在开发过程中吧多线程检测开关开了,以保证不出现多线程安全问题。
再来说说崩溃本身,这个崩溃看上去像是你在调用napi_call_function的时候,入参func有问题,是个非法入参,你可以排查napi_value有没有被你缓存下来了。这种有可能是napi_value被你缓存之后,napi_value出了作用域失效了,然后你又在使用它。如果有类似逻辑,你得用napi_ref来储存,napi_ref可以延长生命周期。
使用Node-API接口进行生命周期相关开发-Node-API使用指导-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者
推荐你也看看下面这个文章
易错API的使用规范-稳定性编码规范-稳定性优化-稳定性-应用质量 - 华为HarmonyOS开发者
更多关于有没有获取HarmonyOS鸿蒙Next最新napi_env的方法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,获取最新的napi_env
可以通过调用napi_get_global
函数来实现。napi_env
是Node-API的执行环境对象,通常在Native模块初始化时通过napi_get_global
或napi_create_environment
获取。确保在Native模块的初始化函数中正确使用这些API来获取napi_env
。
在HarmonyOS Next中,直接缓存napi_env确实会导致稳定性问题,因为napi_env是与特定线程/上下文绑定的。针对你的场景,建议采用以下方案:
- 使用napi_get_node_env获取当前环境的napi_env:
napi_status status = napi_get_node_env(env, ¤t_env);
- 对于异步场景,可以通过napi_open_callback_scope确保正确的执行上下文:
napi_callback_scope scope;
napi_open_callback_scope(env, nullptr, nullptr, &scope);
// 执行ARKTS调用
napi_close_callback_scope(env, scope);
- 如果必须跨线程使用,应该通过napi_create_threadsafe_function创建线程安全函数。
注意避免:
- 直接存储裸napi_env指针
- 跨线程使用未经保护的napi_env
- 在异步回调中使用缓存的napi_env
崩溃通常是由于使用了无效或过期的napi_env导致的,建议检查调用栈中napi_env的生命周期管理。