在 Android 使用 QuickJS JavaScript 引擎教程

2022-07-22,,,,

quickjs javascript 引擎android 接口框架,整体基于面向对象设计,提供了自动gc功能,使用简单。armeabi-v7a 的大小仅 350kb,是 google v8 不错的替代品,启动速度比 v8 快,内存占用更低,支持 es2020。

  • armeabi-v7a 平台下,整体占用apk空间仅 350kb;
  • js对象自动gc,无需手动释放;
  • 支持 es6 module,可以使用 import、export 函数;
  • 支持 node.js 的 commonjs 规范,可以使用 require、exports 函数;
  • 支持绑定 java 注解函数;
  • 支持通过 java function callback 函数注册js函数;
  • 提供多线程 executor;

使用教程

引入依赖
implementation 'io.github.taoweiji.quickjs:quickjs-android:1.+'
简单示例
quickjs quickjs = quickjs.createruntime();
jscontext context = quickjs.createcontext();
int result = context.executeintegerscript("var a = 2+10;\n a;", "file.js");
context.close();
quickjs.close();

对象介绍

quickjs

运行环境,可以创建多个运行时环境,不同的环境之间不能共享对象,不使用的时候需要销毁。

quickjs quickjs = quickjs.createruntime();
jscontext

由 quickjs 创建,一个 quickjs 可以创建多个 jscontext,不使用的时候需要销毁。

jscontext context = quickjs.createcontext();
int result = context.executeintegerscript("var a = 2+10;\n a;", "file.js");
string result = context.executestringscript("'hello world';", "file.js");
context.close();
jsobject
jsobject user = new jsobject(context).set("name", "wiki").set("age", 18).set("time",system.currenttimemillis());
log.e("quickjs", string.valueof(user.getstring("name")));
log.e("quickjs", string.valueof(user.getinteger("age")));
log.e("quickjs", string.valueof(user.getdouble("time")));

user.registerjavamethod(new javavoidcallback() {
    @override
    public void invoke(jsobject receiver, jsarray args) {
        log.e("quickjs", args.getstring(0));
    }
}, "log");
user.executevoidfunction("log", new jsarray(context).push("hello world"));
jsarray
jsarray array = new jsarray(context).push(1).push(3.14).push(true).push("hello world");
log.e("quickjs", string.valueof(array.getinteger(0)));
log.e("quickjs", string.valueof(array.getdouble(1)));
jsfunction
jsfunction log = new jsfunction(context, new javavoidcallback() {
    @override
    public void invoke(jsobject receiver, jsarray args) {
        log.e("quickjs", args.getstring(0));
    }
});
jsfunction message = new jsfunction(context, new javacallback() {
    @override
    public object invoke(jsobject receiver, jsarray array) {
        return "hello world";
    }
});
context.set("console", new jsobject(context).set("log", log).set("message", message));
context.executevoidscript("console.log(console.message())", null);
addjavascriptinterface
public class console {
    int count = 0;

    @javascriptinterface
    public void log(string msg) {
        count++;
        log.d("console", msg);
    }

    @javascriptinterface
    public void info(string msg) {
        count++;
        log.i("console", msg);
    }

    @javascriptinterface
    public void error(string msg) {
        count++;
        log.e("console", msg);
    }

    @javascriptinterface
    public int count() {
        return count;
    }
}

context.addjavascriptinterface(new console(), "console");
context.executevoidscript("console.log('hello world')", null);
int count = context.executeintegerscript("console.count()", null);
log.d("console", string.valueof(count));

《在 Android 使用 QuickJS JavaScript 引擎教程.doc》

下载本文的Word格式文档,以方便收藏与打印。