HarmonyOS 鸿蒙Next 无法找到 OH_JSVM_DefineClass 定义的类

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

HarmonyOS 鸿蒙Next 无法找到 OH_JSVM_DefineClass 定义的类
//使用 OH_JSVM_DefineClass 定义类 TestA

JSVM_CallbackStruct param[1];
param[0].data = nullptr;
param[0].callback = JSEngineCore::test;

JSVM_PropertyDescriptor descriptors[] = {
  {"test", NULL, &param[0], NULL, NULL, NULL, JSVM_STATIC},
};

JSVM_Value testClass = nullptr;
JSVM_CallbackStruct param1;
param1.data = nullptr;
param1.callback = [](JSVM_Env env, JSVM_CallbackInfo info) -> JSVM_Value {
  JSVM_Value thisVar = nullptr;
  OH_JSVM_GetCbInfo(env, info, nullptr, nullptr, &thisVar, nullptr);

  return thisVar;
};
auto status = OH_JSVM_DefineClass(env, "TestA", JSVM_AUTO_LENGTH, &param1, sizeof(descriptors) / sizeof(descriptors[0]), descriptors ,&testClass);

//编译并执行一段js脚本,包含自定义类对静态方法的调用
const char* source = "TestA.test()";
auto length = strlen(source);

JSVM_Value sourceCode;
status = OH_JSVM_CreateStringUtf8(env, source, length, &sourceCode);

JSVM_Script script = nullptr;
status = OH_JSVM_CompileScript(env, sourceCode, nullptr, 0, true, nullptr, &script);

JSVM_Value result = nullptr;// 执行js代码
//这里报错---->"ReferenceError: TestA is not defined\n at <anonymous>:1:1"
status = OH_JSVM_RunScript(env, script, &result);
if (status != JSVM_OK) {

  bool isPending = false;
  if (JSVM_OK == OH_JSVM_IsExceptionPending((env), &isPending) && isPending) {
    JSVM_Value error;
    if (JSVM_OK == OH_JSVM_GetAndClearLastException((env), &error)) {
      // 获取异常堆栈
      JSVM_Value stack;
      OH_JSVM_GetNamedProperty((env), error, "stack", &stack);

      JSVM_Value message;
      OH_JSVM_GetNamedProperty((env), error, "message", &message);

      char stackstr[256]{0};
      OH_JSVM_GetValueStringUtf8(env, stack, stackstr, 256, nullptr);

      char messagestr[256]{0};
      OH_JSVM_GetValueStringUtf8(env, message, messagestr, 256, nullptr);
    }
  }
}

问题,怎样注入一个自定义类,并能被脚本执行?


更多关于HarmonyOS 鸿蒙Next 无法找到 OH_JSVM_DefineClass 定义的类的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复
关于提供的demo中包含这段代码 const char* source = "TestA.test()"; 你是想通过OH_JSVM_DefineClass 创建的TestA 然后调用test()方法么,当前OH_JSVM_DefineClass 创建的是JSVM_Value的对象,不能这么调用方法。

使用 OH_JSVM_GetGlobal 接口获取当前 env 的 globalThis 对象,然后使用 OH_JSVM_SetNamedProperty 接口将上面代码创建的 TestA 对象设置为 globalThis 的属性,OH_JSVM_CompileScript 就能识别了

更多关于HarmonyOS 鸿蒙Next 无法找到 OH_JSVM_DefineClass 定义的类的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,OH_JSVM_DefineClass 是一个用于在JavaScript虚拟机(JSVM)中定义Java类的方法。如果在HarmonyOS Next环境中无法找到通过 OH_JSVM_DefineClass 定义的类,可能的原因及解决方法如下:

  1. 类名或包名错误:确保在调用 OH_JSVM_DefineClass 时提供的类名和包名与实际定义的类名和包名完全一致。

  2. JSVM环境未正确初始化:在调用 OH_JSVM_DefineClass 前,确保JSVM环境已经被正确初始化。检查初始化代码,确保没有错误。

  3. 类定义时机问题:如果类定义在JSVM环境初始化后的某个特定时间点之后,可能由于执行顺序问题导致类无法被找到。确保类定义在JSVM可用后立即执行。

  4. 版本兼容性问题:检查HarmonyOS Next的版本是否支持当前使用的JSVM API。有时API会在新版本中发生变化或废弃。

  5. 权限或安全策略:确认应用是否有足够的权限去访问和定义JSVM中的类。某些安全策略可能限制了此类操作。

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

回到顶部