HarmonyOS 鸿蒙Next JSVM Demo不完整
HarmonyOS 鸿蒙Next JSVM Demo不完整
按咨询文档(https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/napi/use-jsvm-runtime-task.md)
运行Demo,发现不能正常编译,有关键几处实现希望能放开一下。
#include “common.h”
#include "myobject.h"
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
1. common文件的实现是什么? JSVM_CALL是里面定义的宏?
myobject.h 无意义吧
2. PumpMessageLoop/PerformMicrotaskCheckpoint 没有找到这2个方法的时候,是不是和V8一样的效果
2 回复
import { hilog } from '@kit.PerformanceAnalysisKit';
import testNapi from 'libentry.so';
function MyCallback(a: string, b: string): string {
console.log("TEST MyCallback run: " + a);
b = "callback done";
console.log("TEST MyCallback run: " + b);
return "callback pass";
}
function MyCallback2(a: string, b: string): string {
console.log("TEST MyCallback2 start: a = " + a);
console.log("TEST MyCallback2 start: b = " + b);
return "MyCallback2 pass";
}
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
let sourceCodeStr = `{
let a = "hello World";
consoleinfo(a);
const mPromise = createPromise();
mPromise.then((result) => {
assertEqual(result, 0);
onJSResultCallback(result, "abc", "v");
});
a;
};`;
let sourcecodestr1 = `{
let a = "second hello";
consoleinfo(a);
let b = add(99, 1);
assertEqual(100, b);
assertEqual(add(99, 1), 100);
createPromise().then((result) => {
assertEqual(result, 1);
consoleinfo(onJSResultCallback(result, '999','666'));});
a;
};`;
// 创建首个运行环境,并绑定TS回调
const coreId = testNapi.createJsCore(MyCallback);
console.log("TEST coreId: " + coreId);
// 在首个运行环境中执行JS代码
console.log("TEST evalUateJS : " + testNapi.evalUateJS(coreId, sourceCodeStr));
//创建第二个运行环境,并绑定TS回调
const coreId1 = testNapi.createJsCore(MyCallback2);
console.log("TEST coreId: " + coreId1);
// 在第二个运行环境中执行JS代码
console.log("TEST evalUateJS : " + testNapi.evalUateJS(coreId1, sourcecodestr1));
// 释放第二个运行环境
testNapi.releaseJsCore(coreId1);
// 释放首个运行环境
testNapi.releaseJsCore(coreId);
hilog.info(0x0000, 'testTag', 'Test NAPI end');
})
}
.width('100%')
}
.height('100%')
}
aboutToDisappear(): void {
}
}
#ifndef FOUNDATION_ACE_JSVM_INTERFACES_KITS_JSVM_NATIVE_COMMON_H
#define FOUNDATION_ACE_JSVM_INTERFACES_KITS_JSVM_NATIVE_COMMON_H
#define DEPRECATED __attribute__((__deprecated__))
#define JSVM_VERSION 8
#define JSVM_RETVAL_NOTHING
#define GET_AND_THROW_LAST_ERROR(env) \
do { \
const JSVM_ExtendedErrorInfo* errorInfo = nullptr; \
OH_JSVM_GetLastErrorInfo((env), &errorInfo); \
bool isPending = false; \
OH_JSVM_IsExceptionPending((env), &isPending); \
if (!isPending && errorInfo != nullptr) { \
const char* errorMessage = \
errorInfo->errorMessage != nullptr ? errorInfo->errorMessage : "empty error message"; \
OH_JSVM_ThrowError((env), nullptr, errorMessage); \
} \
} while (0)
#define JSVM_ASSERT_BASE(env, assertion, message, retVal) \
do { \
if (!(assertion)) { \
OH_JSVM_ThrowError((env), nullptr, "assertion (" #assertion ") failed: " message); \
return retVal; \
} \
} while (0)
#define JSVM_ASSERT(env, assertion, message) JSVM_ASSERT_BASE(env, assertion, message, nullptr)
#define JSVM_ASSERT_RETURN_VOID(env, assertion, message) JSVM_ASSERT_BASE(env, assertion, message, JSVM_RETVAL_NOTHING)
#define JSVM_CALL_BASE(env, theCall, retVal) \
do { \
if ((theCall) != JSVM_OK) { \
GET_AND_THROW_LAST_ERROR((env)); \
return retVal; \
} \
} while (0)
#define JSVM_CALL(env, theCall) JSVM_CALL_BASE(env, theCall, nullptr)
#define NODE_API_CALL(env, the_call) \
NODE_API_CALL_BASE(env, the_call, NULL)
#define JSVM_CALL_RETURN_VOID(env, theCall) JSVM_CALL_BASE(env, theCall, JSVM_RETVAL_NOTHING)
#define DECLARE_JSVM_PROPERTY(name, val) \
{ \
(name), nullptr, nullptr, nullptr, nullptr, val, napi_default, nullptr \
}
#define DECLARE_JSVM_STATIC_PROPERTY(name, val) \
{ \
(name), nullptr, nullptr, nullptr, nullptr, val, napi_static, nullptr \
}
#define DECLARE_JSVM_FUNCTION(name, func) \
{ \
(name), nullptr, (func), nullptr, nullptr, nullptr, napi_default, nullptr \
}
#define DECLARE_JSVM_FUNCTION_WITH_DATA(name, func, data) \
{ \
(name), nullptr, (func), nullptr, nullptr, nullptr, napi_default, data \
}
#define DECLARE_JSVM_STATIC_FUNCTION(name, func) \
{ \
(name), nullptr, (func), nullptr, nullptr, nullptr, napi_static, nullptr \
}
#define DECLARE_JSVM_GETTER(name, getter) \
{ \
(name), nullptr, nullptr, (getter), nullptr, nullptr, napi_default, nullptr \
}
#define DECLARE_JSVM_SETTER(name, setter) \
{ \
(name), nullptr, nullptr, nullptr, (setter), nullptr, napi_default, nullptr \
}
#define DECLARE_JSVM_GETTER_SETTER(name, getter, setter) \
{ \
(name), nullptr, nullptr, (getter), (setter), nullptr, napi_default, nullptr \
}
#endif
PumpMessageLoop、PerformMicrotaskCheckpoint屏蔽掉
myobject.h头文件的引用屏蔽调。
关于Hilog的使用,您可以参考以下文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/hilog-guidelines-ndk-V5
针对您提出的“HarmonyOS 鸿蒙Next JSVM Demo不完整”问题,以下是一些可能的解决思路:
- 检查Demo完整性:首先确认您获取的HarmonyOS 鸿蒙Next JSVM Demo是否来自官方或可靠来源,确保Demo本身没有缺失或损坏。
- 审查代码逻辑:仔细检查Demo中的代码逻辑,特别是与JSVM对象创建、使用和销毁相关的部分。确保所有对象都在正确的作用域内创建,并且生命周期管理得当。
- 查阅官方文档:参考HarmonyOS官方文档,了解JSVM的详细使用方法和最佳实践。这有助于您更好地理解Demo中的代码,并发现可能的问题所在。
- 更新和兼容性检查:确保您的开发环境(包括HarmonyOS SDK、DevEco Studio等)已更新到最新版本,并且与您的设备兼容。
如果以上步骤都无法解决您遇到的问题,可能是更深层次的系统或兼容性问题。此时,请联系官网客服以获取更专业的帮助。官网地址是:https://www.itying.com/category-93-b0.html。