欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在 Android 使用 QuickJS JavaScript 引擎教程

程序员文章站 2022-03-04 09:52:44
quickjs-android 是 QuickJS JavaScript 引擎的 Android 接口框架,整体基于面向对象设计,提供了自动GC功能,使用简单。armeabi-v7a 的大小仅 350KB,是 Google V8 不错的替代品,启动速度比 V8 快,内存占用更低,支持 ES2020。 ......

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));