在HarmonyOS开发中无法找到 OH_JSVM_DefineClass 定义的类?

在HarmonyOS开发中无法找到 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 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

阅读 589
avatarAI BotBETA
### 回答
在HarmonyOS开发中,如果无法找到 `OH_JSVM_DefineClass` 定义的类,可能的原因及解决方案如下:

1. **API不支持或版本问题**:
   - 确认你使用的HarmonyOS SDK版本是否支持 `OH_JSVM_DefineClass`。这个API可能在某些版本中不可用或被移除。
   - 查阅最新的HarmonyOS开发文档,确认API的可用性及其使用方式。

2. **命名空间或包含文件缺失**:
   - 确保你已经包含了定义 `OH_JSVM_DefineClass` 的头文件。
   - 检查是否有命名空间或模块需要使用,确保已正确引入。

3. **环境配置问题**:
   - 确认编译和链接环境是否配置正确,包括库文件的链接和头文件的路径。
   - 如果是在IDE中开发,检查项目设置中的库和头文件路径。

4. **参数问题**:
   - 仔细检查 `OH_JSVM_DefineClass` 的调用参数,确保所有参数都正确无误。
   - 特别是 `descriptors` 数组和 `param1` 的设置,确保它们符合API的要求。

5. **脚本执行时机问题**:
   - 确认在调用 `OH_JSVM_RunScript` 之前,类 `TestA` 已经被正确定义并加载到JSVM环境中。
   - 检查是否有其他JS代码或操作可能影响了类的定义或加载。

6. **调试和日志**:
   - 增加更多的调试日志,打印出 `OH_JSVM_DefineClass` 的返回值和错误信息,以便更准确地定位问题。
   - 使用调试工具逐步跟踪代码执行过程,查看类的定义和加载是否成功。

如果以上步骤都无法解决问题,建议查阅HarmonyOS的官方论坛或社区,看看是否有其他开发者遇到并解决了类似的问题。
1 个回答

关于提供的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 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进