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