HarmonyOS 鸿蒙Next 无法找到 OH_JSVM_DefineClass 定义的类
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, ¶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 鸿蒙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