关于HarmonyOS 鸿蒙Next中JSVM创建原生对象的生命周期问题

发布于 1周前 作者 wuwangju 最后一次编辑是 5天前 来自 鸿蒙OS

关于HarmonyOS 鸿蒙Next中JSVM创建原生对象的生命周期问题

目前正在试用JSVM_API。在demo中向 JSVM里添加了诸多对象,但是在注入的js中调用这些对象时会说这些对象找不到。demo的伪代码大致如下:

initJsEnv(){
  JSVM_Value global;
  OH_JSVM_GetGlobal(jsvm_env, &global);
  JSVM_Value base;
  OH_JSVM_CreateObject(jsvm_env, &base);
  OH_JSVM_SetNamedProperty(jsvm_env, global, "__base__", base);
}

static char* runScript(JSVM_Env env, char *buf, size_t buf_len) {
  OH_JSVM_RunScript(env,"typeof globale.__base__", &result);
}
 

最后会报错说__base__未定义。目前怀疑是demo中提供的那个handlescope本身只能在一个方法里生效,跨方法就没法用了。官方提供的demo全部都是一个方法把所有事情都做了。而正常的项目开发,所有功能都分在不同的方法里,因此demo就缺乏参考性了。想知道该如何在js环境中添加一个全局的对象。 文档地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/jsvm-data-types-interfaces-V5#创建js对象类型和基本类型

2 回复
通过下面代码向global添加__base__对象
JSVM_Value global;
OH_JSVM_GetGlobal(env, &global);
JSVM_Value base;
OH_JSVM_CreateObject(env, &base);
OH_JSVM_SetNamedProperty(env, global, "__base__", obj);<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

在JS代码中可以通过 this.__base__ 方式获取,实际测试在OH_JSVM_CloseHandleScope后执行JS脚本也是可以获取到的。

关于HarmonyOS 鸿蒙Next中JSVM创建原生对象的生命周期问题,这通常涉及到对象在JavaScript虚拟机(JSVM)环境中的创建、使用和销毁过程。在HarmonyOS中,JSVM用于执行JavaScript代码,并管理其中的对象和生命周期。

当在JSVM中创建原生对象时,这些对象会被分配到特定的内存区域,并在使用过程中通过引用进行访问。然而,如果在创建对象后未能正确设置其作用域或生命周期管理策略,可能会导致对象在需要时无法被找到或访问。

具体到你的问题,如果在注入的JavaScript代码中找不到创建的原生对象,可能是由于作用域限制或生命周期管理不当导致的。建议检查以下几点:

  1. 确保对象在全局作用域中创建,或者通过适当的作用域链进行访问。
  2. 检查对象的生命周期管理策略,确保对象在需要时仍然有效。
  3. 查阅HarmonyOS官方文档,了解JSVM和原生对象管理的最佳实践。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部