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 |