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
投稿
猜你喜欢
- 本文实例讲述了Android使用GPS获取用户地理位置并监听位置变化的方法。分享给大家供大家参考,具体如下:LocationActivity
- 相信大家和我一样,接触java这门语言的时候就听过java位运算的鼎鼎大名,当然也仅限于听说过。日常开发过程中使用过么?使用位运算的好处是什
- Spring @Cacheable指定失效时间新版本配置@Configuration@EnableCachingpublic class R
- 记录自己用java swing做的第一个简易界面。LoginAction.javapackage com.QQUI0819;import j
- Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。
- 一、基本概念C#只有两种数据类型:值类型和引用类型值类型在线程栈分配空间,引用类型在托管堆分配空间值类型转为引用类型称成为装箱,引用类型转为
- 前提: 可以参考文章 SpringBoot 接入 SparkSpringBoot 已经接入 Spark已配置 JavaSparkContex
- 1、安装依赖<dependency> <
- @PropertySource作用是:对自定义的properties文件加载使用:@PropertySource(value={"
- 下面是自己写的三个方法,直接类名.方法即可调用,注意此处未做异常处理.1.下划线转驼峰 lowerLineToHump()2.首字母大写 c
- 目标:了解Swagger的作用和概念了解前后端分离在springBoot中集成SwaggerSwagger简介前后端分离VUE+spring
- 目录Retrofit介绍Retrofit优点Retrofit的使用1.引入依赖项2.添加网络权限3.编写Retrofit辅助类4.定义Api
- 逻辑描述:现在我们想在B层和D层加上接口层,并使用工厂。而我们可以将创建B和创建D看作是两个系列,然后就可以使用抽象工厂进行创建了。配置文件
- 本文实例讲述了Android编程实现WebView添加进度条的方法。分享给大家供大家参考,具体如下:标准的XML界面<?xml ver
- Java去掉指定字符串的开头的指定字符/** * 去掉指定字符串的开头的指定字符 *
- 方式一:例如:”0000123” (字符串必须全为数字)处理过程:String tempStr = "0000123";
- 本文实例为大家分享了Android实现语音播放与录音的具体代码,供大家参考,具体内容如下项目用到的技术点和亮点语音录音 (单个和列表)语音播
- 程序绑定的概念:绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后
- 前言跳过废话,直接看正文当年入坑Java是因为它的跨平台优势。那时我认为,”编写一次,处处运行。”这听上去多么牛逼,应该是所有语言发展的终极
- JDK12的五大重要新特性Java12在March 19, 2019发布了。在2017年发布Java 9之后,Java平台发布节奏已从每3年