软件编程
位置:首页>> 软件编程>> Android编程>> Android 下的 QuickJS Binding 库特性使用详解

Android 下的 QuickJS Binding 库特性使用详解

作者:汪海游龙  发布时间:2022-08-08 00:24:24 

标签:Android,QuickJS,Binding,库

GitHub 地址:quickjs-android-wrapper

特性

  • 支持 Java 和 JavaScript 类型互转

  • 支持 Promise 异步执行

  • 支持字节码编译和执行

  • 支持模块加载执行

  • 内置 console.log 实现

  • 统一的 JavaScript 异常处理

依赖

repositories {
 mavenCentral()
}
dependencies {
 implementation 'wang.harlon.quickjs:wrapper:0.0.18'
}

使用

创建 JSContext

QuickJSContext context = QuickJSContext.create();

执行 JavaScript

QuickJSContext context = QuickJSContext.create();
context.evaluate("var a = 1 + 2;");

支持的 Java 类型

以下的 Java 类型可以直接转换到 JavaScript 中使用:

boolean

int

double

String

null

JSObject 代表一个 JavaScript 对象

JSFunction 代表一个 JavaScript 方法

JSArray 代表一个 JavaScript 数组

属性设置

Java

JSObject globalObj = context.getGlobalObject();
JSObject obj1 = context.createNewJSObject();
obj1.setProperty("stringProperty", "hello");
obj1.setProperty("intProperty", 1);
obj1.setProperty("doubleProperty", 0.1);
obj1.setProperty("booleanProperty", true);
obj1.setProperty("functionProperty", (JSCallFunction) args -> {
   return args[0] + "Wang";
});
globalObj.setProperty("obj1", obj1);

JavaScript

obj1.stringProperty; // hello string
obj1.intProperty; // 1
obj1.doubleProperty; // 0.1
obj1.booleanProperty; // true
obj1.functionProperty('Harlon'); // HarlonWang

属性获取

JavaScript

var obj1 = {
stringProperty: 'hello string',
intProperety: 1,
doubleProperty: 0.1,
booleanProperty: true,
functionProperty: (name) => { return name + 'Wang'; }
}

Java

JSObject globalObject = context.getGlobalObject();
JSObject obj1 = globalObject.getJSObjectProperty("obj1");
obj1.getProperty("stringProperty"); // hello
obj1.getProperty("intProperty"); // 1
obj1.getProperty("doubleProperty"); // 0.1
obj1.getProperty("booleanProperty"); // true
obj1.getJSFunctionProperty("functionProperty").call("Harlon"); // HarlonWang

编译和执行字节码

byte[] code = context.compile("'hello, world!'.toUpperCase();");
context.execute(code);

ESModule 模块加载和执行

Java

JSModule.setModuleLoader(new JSModule.Loader() {
   @Override
   public String getModuleScript(String moduleName) {
       return "export var name = 'Hello world';\n" +
               "export var age = 18;";
   }
});

JavaScript

import {name, age} from './a.js';
console.log('name:' + name); // Jack
console.log('age:' + age); // 18

同步

所有的 JavaScript 代码执行都是单线程,基于创建时的线程决定,不支持多线程执行。

参考

quickjs-java

quack

quickjs-android

来源:https://juejin.cn/post/7071185530020429860

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com