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, ¶m[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, ¶m1, 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
2024-11-25 09:09:09
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

关于提供的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 就能识别了。

分享
微博
QQ
微信
回复
2024-11-25 15:24:50
相关问题
HarmonyOS 数据方法无法被调用
272浏览 • 1回复 待解决
无法找到“riscv32-unknown-elf-gcc”。
13753浏览 • 2回复 待解决
HarmonyOS 关于OH_AudioRenderer问题
390浏览 • 1回复 待解决
HarmonyOS JSVM是否在Gitee上开源?
159浏览 • 1回复 待解决