当前位置 : 主页 > 手机开发 > android >

Android下的QuickJSBinding库特性使用详解

来源:互联网 收集:自由互联 发布时间:2023-02-01
目录 特性 依赖 使用 创建 JSContext 执行 JavaScript 支持的 Java 类型 属性设置 属性获取 编译和执行字节码 ESModule 模块加载和执行 同步 GitHub 地址:quickjs-android-wrapper 特性 支持 Java 和 Jav
目录
  • 特性
  • 依赖
  • 使用
    • 创建 JSContext
    • 执行 JavaScript
    • 支持的 Java 类型
    • 属性设置
    • 属性获取
    • 编译和执行字节码
    • ESModule 模块加载和执行
  • 同步

    GitHub 地址:quickjs-android-wrapper

    特性

    • 支持 Java 和 JavaScript 类型互转
    • 支持 Promise 异步执行
    • 支持字节码编译和执行
    • 支持模块加载执行
    • 内置 console.log 实现
    • 统一的 JavaScript 异常处理

    依赖

    repositories {
      mavenCentral()
    }
    dependencies {
      implementation 'wang.harlon.quickjs:wrapper:0.0.18'
    }
    

    使用

    创建 JSContext

    QuickJSContext context = QuickJSContext.create();
    

    执行 JavaScript

    QuickJSContext context = QuickJSContext.create();
    context.evaluate("var a = 1 + 2;");
    

    支持的 Java 类型

    以下的 Java 类型可以直接转换到 JavaScript 中使用:

    boolean

    int

    double

    String

    null

    JSObject 代表一个 JavaScript 对象

    JSFunction 代表一个 JavaScript 方法

    JSArray 代表一个 JavaScript 数组

    属性设置

    Java

    JSObject globalObj = context.getGlobalObject();
    JSObject obj1 = context.createNewJSObject();
    obj1.setProperty("stringProperty", "hello");
    obj1.setProperty("intProperty", 1);
    obj1.setProperty("doubleProperty", 0.1);
    obj1.setProperty("booleanProperty", true);
    obj1.setProperty("functionProperty", (JSCallFunction) args -> {
        return args[0] + "Wang";
    });
    globalObj.setProperty("obj1", obj1);
    

    JavaScript

    obj1.stringProperty; // hello string
    obj1.intProperty; // 1
    obj1.doubleProperty; // 0.1
    obj1.booleanProperty; // true
    obj1.functionProperty('Harlon'); // HarlonWang
    

    属性获取

    JavaScript

    var obj1 = {
    	stringProperty: 'hello string',
    	intProperety: 1,
    	doubleProperty: 0.1,
    	booleanProperty: true,
    	functionProperty: (name) => { return name + 'Wang'; }
    }
    

    Java

    JSObject globalObject = context.getGlobalObject();
    JSObject obj1 = globalObject.getJSObjectProperty("obj1");
    obj1.getProperty("stringProperty"); // hello
    obj1.getProperty("intProperty"); // 1
    obj1.getProperty("doubleProperty"); // 0.1
    obj1.getProperty("booleanProperty"); // true
    obj1.getJSFunctionProperty("functionProperty").call("Harlon"); // HarlonWang
    

    编译和执行字节码

    byte[] code = context.compile("'hello, world!'.toUpperCase();");
    context.execute(code);
    

    ESModule 模块加载和执行

    Java

    JSModule.setModuleLoader(new JSModule.Loader() {
        @Override
        public String getModuleScript(String moduleName) {
            return "export var name = 'Hello world';\n" +
                    "export var age = 18;";
        }
    });
    

    JavaScript

    import {name, age} from './a.js';
    console.log('name:' + name); // Jack
    console.log('age:' + age); // 18
    

    同步

    所有的 JavaScript 代码执行都是单线程,基于创建时的线程决定,不支持多线程执行。

    参考

    quickjs-java

    quack

    quickjs-android

    以上就是Android 下的 QuickJS Binding 库特性使用详解的详细内容,更多关于Android QuickJS Binding 库的资料请关注自由互联其它相关文章!

    上一篇:Android实现一键锁屏功能
    下一篇:没有了
    网友评论