• 在 Android 使用 QuickJS JavaScript 引擎教程


    quickjs-androidQuickJS 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;
     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;
     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));
    
  • 相关阅读:
    JDBC基本入门-JDBC中各个接口和类详解
    Docker 安装与基本使用
    java打包和运行的方式
    使用@Valid+BindingResult进行controller参数校验
    Antd使用timePicker封装时间范围选择器(React hook版)
    antd的table组件设置Column的width列宽度不生效问题
    vector二维数组如何排序
    递归反转链表(通俗详解)
    安装pythorch出现“由于目标计算机积极拒绝,无法连接”问题
    C语言字符串
  • 原文地址:https://www.cnblogs.com/taoweiji/p/14839326.html
Copyright © 2020-2023  润新知