在 Android 使用 QuickJS JavaScript 引擎教程

ImWiki 發表於 2021-06-01
JavaScript Android

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

使用教程

https://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