HarmonyOS 鸿蒙Next JSVM Demo不完整

发布于 1周前 作者 caililin 来自 鸿蒙OS

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不完整”问题,以下是一些可能的解决思路:

  1. 检查Demo完整性:首先确认您获取的HarmonyOS 鸿蒙Next JSVM Demo是否来自官方或可靠来源,确保Demo本身没有缺失或损坏。
  2. 审查代码逻辑:仔细检查Demo中的代码逻辑,特别是与JSVM对象创建、使用和销毁相关的部分。确保所有对象都在正确的作用域内创建,并且生命周期管理得当。
  3. 查阅官方文档:参考HarmonyOS官方文档,了解JSVM的详细使用方法和最佳实践。这有助于您更好地理解Demo中的代码,并发现可能的问题所在。
  4. 更新和兼容性检查:确保您的开发环境(包括HarmonyOS SDK、DevEco Studio等)已更新到最新版本,并且与您的设备兼容。

如果以上步骤都无法解决您遇到的问题,可能是更深层次的系统或兼容性问题。此时,请联系官网客服以获取更专业的帮助。官网地址是:https://www.itying.com/category-93-b0.html

回到顶部