quickjs-Android 是 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;
使用教程
https://github.com/taoweiji/quickjs-android
引入依赖
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));
来源: http://www.jianshu.com/p/52775b473d95