在 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;\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");
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));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM