在 Android 使用 QuickJS JavaScript 引擎教程

quickjs-android 是 QuickJS JavaScript 引擎的 Android 介面框架,整體基於面向對象設計,提供了自動GC功能,使用簡單。armeabi-v7a 的大小僅 350KB,是 Google V8 不錯的替代品,啟動速度比 V8 快,記憶體佔用更低,支援 ES2020

使用教程

//github.com/taoweiji/quickjs-android

引入依賴
implementation 'io.github.taoweiji.quickjs:quickjs-android:1.1.3'
簡單示例
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");
JSObject
JSObject user = new JSObject(context).set("name", "Wiki").set("age", 18);
Log.e("QuickJS", String.valueOf(user.getString("name")));
Log.e("QuickJS", String.valueOf(user.getInteger("age")));

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

QuickJS

方法 說明
static QuickJS createRuntime() 創建運行時
JSContext createContext() 創建上下文
void close() 銷毀引擎

JSValue

對象會自動回收,開發者無需手動close()

方法 說明
static JSObject Undefined(JSContext context) 獲取Undefined對象
static JSValue NULL() 獲取NULL對象
TYPE getType() 獲取數據類型
boolean isUndefined()

JSObject

繼承JSValue

方法 說明
set(key, value) 設置屬性,支援int、boolean、double、String、JSValue
int getInteger(String key) 返回值int對象值,如果沒有就會返回0
boolean getBoolean(String key) 返回值boolean對象值,如果沒有就會返回false
double getDouble(String key) 返回值double對象值,如果沒有就會返回0
String getString(String key) 返回值String對象值,如果沒有就會返回null
JSArray getArray(String key) 返回值JSArray對象值,如果沒有就會返回null
JSObject getObject(String key) 可能會返回JSObject、JSArray、JSFunction,如果沒有就會返回null
registerJavaMethod(JavaCallback callback, String jsFunctionName) 註冊JS函數,調用函數會執行java的Callback,帶有返回值
registerJavaMethod(JavaVoidCallback callback, String jsFunctionName) 註冊JS函數,調用函數會執行java的Callback,不帶返回值
Object executeFunction(String name, JSArray parameters) 可能會返回Integer、Double、Boolean、String、JSArray、JSObject、JSFunction、null
double executeDoubleFunction(String name, JSArray parameters) 返回 double,默認返回 0
boolean executeBooleanFunction(String name, JSArray parameters) 返回boolean,默認人會false
String executeStringFunction(String name, JSArray parameters) 返回String,默認返回null
JSArray executeArrayFunction(String name, JSArray parameters) 返回JSArray,默認返回null
JSObject executeObjectFunction(String name, JSArray parameters) 可能會返回JSObject、JSArray、JSFunction,默認返回null
void executeVoidFunction(String name, JSArray parameters) 沒有返回值
Object executeFunction2(String name, Object… parameters) 可能返回Integer、Double、Boolean、String、JSArray、JSObject、JSFunction、null,入參為java數組,僅支援Integer、Double、Boolean、String、JSArray、JSObject、JSFunction、null
boolean contains(String key) 是否包含該欄位
String[] getKeys() 獲取屬性列表

JSArray

繼承JSObject

方法 說明
push(value) 設置屬性,支援int、boolean、double、String、JSValue
int getInteger(String key) 返回值int對象值,如果沒有就會返回0
boolean getBoolean(String key) 返回值boolean對象值,如果沒有就會返回false
double getDouble(String key) 返回值double對象值,如果沒有就會返回0
String getString(String key) 返回值String對象值,如果沒有就會返回null
JSArray getArray(String key) 返回值JSArray對象值,如果沒有就會返回null
JSObject getObject(String key) 可能會返回JSObject、JSArray、JSFunction,如果沒有就會返回null
length() 數組大小

JSFunction

繼承JSObject

方法 說明
JSFunction(JSContext context, JavaCallback callback) 構造函數
JSFunction(JSContext context, JavaVoidCallback callback) 構造函數
Object call(JSValue.TYPE type, JSObject receiver, JSArray parameters) 調用方法

JSContext

繼承JSObject,擁有JSObject全部方法,對象本身是全局對象

方法 說明
void close() 銷毀上下文
int executeIntegerScript(String source, String fileName) 執行js腳本
double executeDoubleScript(String source, String fileName) 執行js腳本
String executeStringScript(String source, String fileName) 執行js腳本
boolean executeBooleanScript(String source, String fileName) 執行js腳本
Object executeScript(String source, String fileName) 執行js腳本,可能返回Integer、Double、Boolean、String、JSArray、JSObject、JSFunction、null
void executeVoidScript(String source, String fileName) 執行js腳本,無返回值
JSArray executeArrayScript(String source, String fileName) 執行js腳本,返回值為JSArray
JSObject executeObjectScript(String source, String fileName) 執行js腳本,可能會返回JSObject、JSArray、JSFunction
Tags: