Giter VIP home page Giter VIP logo

quickjs-android's Introduction

quickjs-android

Download

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函数;
  • 内置 Event Queue,开发者可以在任意线程执行代码,无需关心JS单线程问题;

使用教程

引入依赖
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();
// 如果需要在多线程执行,必须创建带有线程池的环境
// QuickJS quickJS = QuickJS.createRuntimeWithEventQueue();
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));

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

quickjs-android's People

Contributors

taoweiji avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

quickjs-android's Issues

怎么把json数据转成JSObject?

我有一个场景:调用一个接口,需要把接口返回的 json 数据,通过JSFunction.call(JSObject receiver, JSArray parameters)方法,将json 数据传递给JS 文件,有什么办法?
我想把json数据转成JSObject,不知道怎么转?

JSObject和JSArray结构设计的有缺陷,特别JSObject无法感知其中数据,不方便转为普通的Map/Object

JSObject中没有一个内部管理的类似map的概念,不知道所有的key值,并且所有的get方法全部是jni native获取,当需要将JSObject转成普通Object(Map)时,无法实现,只能提前预知里面存放的key值数据。
JSArray同样存在获取性能问题,只是多个lenth感知到总长度,每次get时均jni获取。

建议可以参考React Native的中ReadableArray和ReadableMap实现,内部为何一个数据,只需要一次jni接口从底层获取数据。

怎么在JS文件中获取Android传递过来的数组JSArray?

JSArray jsArray = new JSArray(jsContext).push(6).push(7).push(8);
jsFunction.call(null,jsArray);

我在js文件中,收到的数据,为啥不是数组,仅仅只是数组的第一个值?
我要怎么去做才能在js 文件中收到的是一个数组

具体代码如下:
定义一个JS的方法(Test),然后在js文件中调用这个方法,在Android代码中:获取JSFunction,创建一个JSArray ,把这个JSArray通过JSFunction传给JS文件,结果:我在JS文件中获取的是数组的第一个数据,
求我在JS文件中怎么获取整个数组的数据?

jsContext.registerJavaMethod(new JavaVoidCallback() {
@OverRide
public void invoke(JSObject receiver, JSArray args) {
JSFunction jsFunction = (JSFunction) args.get(0);
if (!jsFunction.getContext().isReleased()) {
try {
JSArray jsArray = new JSArray(jsContext);
jsArray.push(61).push(7).push(8);
jsFunction.call(null, jsArray);
}catch (Throwable e){
e.printStackTrace();
}
}
}
}, “Test”);

对象注入

请问可以支持像Rhino引擎一样,可以随意将Java的对象或者整个对象注入到JS吗,还有另外就是我发现get获取的key,只能获取set的,如果是执行脚本产生的变量或者函数,是获取不到的,可以支持一下吗

创建 JSArray 时,有一定几率失败

Cause: null pointer dereference
x0 0000000000000000 x1 00000073317dc4b0 x2 ffffffffffffffff x3 ffffffffffffffff
x4 00000000317dc4b0 x5 00000073317dc4b0 x6 00000073317040b0 x7 00000072c3509020
x8 0000000000000000 x9 0000000000000000 x10 fffffffffff4c700 x11 0000000000000002
x12 00000072c3506320 x13 00000072c3506388 x14 0000000000000000 x15 000000000000000c
x16 00000072c57beac8 x17 00000072c56db6c4 x18 00000072c34f7940 x19 0000007331704000
x20 0000000000000000 x21 0000007331704000 x22 00000072c3506620 x23 00000072d5a72a0b
x24 0000000000000028 x25 00000072c3509020 x26 00000073317040b0 x27 000000000000000a
x28 00000072c3506390 x29 00000072c3506250
sp 00000072c35061d0 lr 00000072c56db788 pc 00000072c56d51a8

backtrace:
#1 pc 000000000003d784 (__JS_FreeValueRT+192)
#2 pc 000000000003dbdc (__JS_FreeValue+40)
#4 pc 000000000000e3b4 (Java_com_quickjs_QuickJSNativeImpl__1releasePtr+124)
#5 pc 0000000000140350 /apex/com.android.runtime/lib64/libart.so (art_quick_generic_jni_trampoline+144) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#6 pc 0000000000137334 /apex/com.android.runtime/lib64/libart.so (art_quick_invoke_stub+548) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#7 pc 0000000000169eac /apex/com.android.runtime/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+244) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#8 pc 00000000003084f8 /apex/com.android.runtime/lib64/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)+384) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#9 pc 0000000000304808 /apex/com.android.runtime/lib64/libart.so (bool art::interpreter::DoCall<true, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+692) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#10 pc 00000000005a77cc /apex/com.android.runtime/lib64/libart.so (MterpInvokeInterfaceRange+472) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#11 pc 0000000000131d14 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_interface_range+20) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#16 pc 00000000002d980c /apex/com.android.runtime/lib64/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEbb.llvm.8069993068248362486+240) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#17 pc 0000000000594720 /apex/com.android.runtime/lib64/libart.so (artQuickToInterpreterBridge+1032) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#18 pc 0000000000140468 /apex/com.android.runtime/lib64/libart.so (art_quick_to_interpreter_bridge+88) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#19 pc 00000000020176b8 /memfd:/jit-cache (deleted) (com.quickjs.EventQueue.postVoid+184)
#20 pc 0000000000137334 /apex/com.android.runtime/lib64/libart.so (art_quick_invoke_stub+548) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#21 pc 0000000000169eac /apex/com.android.runtime/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+244) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#22 pc 00000000003084f8 /apex/com.android.runtime/lib64/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)+384) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#23 pc 0000000000303758 /apex/com.android.runtime/lib64/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+892) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#24 pc 00000000005a3054 /apex/com.android.runtime/lib64/libart.so (MterpInvokeVirtual+648) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#25 pc 0000000000131814 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_virtual+20) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#27 pc 00000000005a3314 /apex/com.android.runtime/lib64/libart.so (MterpInvokeVirtual+1352) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#28 pc 0000000000131814 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_virtual+20) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#32 pc 0000000000140468 /apex/com.android.runtime/lib64/libart.so (art_quick_to_interpreter_bridge+88) (BuildId: 7c5a82c0fd7f1b2054e72522432e1034)
#33 pc 0000000002011bd0 /memfd:/jit-cache (deleted) (com.quickjs.JSContext.checkReleaseObjPtrPool+496)
#34 pc 000000000200c4a8 /memfd:/jit-cache (deleted) (com.quickjs.JSContext.checkReleased+40)
#35 pc 000000000201b2ac /memfd:/jit-cache (deleted) (com.quickjs.JSValue.+220)

请求更新

可以更新一下支持像rhino脚本引擎那样,给引擎注册Java类,直接在引擎里面使用java.io.File这种

await 语法支持有问题,会阻塞后续逻辑

测试代码如下:

jsContext.executeVoidScript("console.log(\"Hello World\");\n" +
                                "function testAsync(params) {\n" +
                                "    console.log(\"test Async start\");\n" +
                                "    return new Promise(function (resolve, reject) {\n" +
                                "        resolve(\"done\");\n" +
                                "    });\n" +
                                "}\n" +
                                "\n" +
                                "async function main(){\n" +
                                "    var t = await testAsync(11);\n" +
                                "    console.log(\"test finish\"+t);\n" +
                                "}\n" +
                                "main();",null);

日志输出如下,test finish 没有输出
D/QuickJS: Hello World
D/QuickJS: test Async start

Android5.0 emoji字符串奔溃

大佬看看这个崩溃能借吗

2023-04-15 23:09:16.392 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xf0
2023-04-15 23:09:16.392 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] string: 'sssf🫀fff'
2023-04-15 23:09:16.392 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] in call to NewStringUTF
2023-04-15 23:09:16.392 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] from java.lang.Object com.quickjs.QuickJSNativeImpl._arrayGet(long, int, com.quickjs.JSValue, int)
2023-04-15 23:09:16.392 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] "QuickJS-0" prio=5 tid=14 Runnable
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] | group="main" sCount=0 dsCount=0 obj=0x12c0b900 self=0x7fc0735a3000
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] | sysTid=8673 nice=0 cgrp=apps sched=0/0 handle=0x7fc06e00aa00
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] | state=R schedstat=( 0 0 0 ) utm=1 stm=0 core=0 HZ=100
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] | stack=0x7fc0603e6000-0x7fc0603e8000 stackSize=1036KB
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] | held mutexes= "mutator lock"(shared held)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] native: #00 pc 00006c19 /system/lib64/libbacktrace_libc++.so (UnwindCurrent::Unwind(unsigned long, ucontext*)+57)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] native: #1 pc 0038aa50 /system/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits >&, int, char const*, art::mirror::ArtMethod*)+96)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] native: #2 pc 0035a617 /system/lib64/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits >&) const+215)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] native: #3 pc 0010e1c3 /system/lib64/libart.so (art::JniAbort(char const*, char const*)+947)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] native: #4 pc 0010f13c /system/lib64/libart.so (art::JniAbortF(char const*, char const*, ...)+220)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] native: #5 pc 00113706 /system/lib64/libart.so (art::ScopedCheck::Check(bool, char const*, ...) (.constprop.132)+1686)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] native: #6 pc 001196c0 /system/lib64/libart.so (art::CheckJNI::NewStringUTF(_JNIEnv*, char const*)+64)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] native: #7 pc 00011807 /data/app/com.game.master.j2v8test-1/lib/x86_64/libquickjs-android.so (To_JObject(_JNIEnv*, long, int, JSValue)+471)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] native: #8 pc 008b7a13 /data/dalvik-cache/x86_64/data@[email protected]@[email protected] (Java_com_quickjs_QuickJSNativeImpl__1arrayGet__JILcom_quickjs_JSValue_2I+251)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.QuickJSNativeImpl._arrayGet(Native method)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.EventQueue.lambda$_arrayGet$8$com-quickjs-EventQueue(EventQueue.java:166)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.EventQueue$$ExternalSyntheticLambda12.run(D8$$SyntheticClass:-1)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.EventQueue.post(EventQueue.java:43)
2023-04-15 23:09:16.393 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.EventQueue._arrayGet(EventQueue.java:166)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.JSArray.get(JSArray.java:53)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.JSArray.getString(JSArray.java:88)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.JSObject.getParameters(JSObject.java:268)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.JSObject.lambda$appendJavascriptInterface$1(JSObject.java:237)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.JSObject$$ExternalSyntheticLambda0.invoke(D8$$SyntheticClass:-1)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.QuickJS.callJavaCallback(QuickJS.java:109)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.QuickJSNativeImpl._executeScript(Native method)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.EventQueue.lambda$_executeScript$4$com-quickjs-EventQueue(EventQueue.java:146)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.EventQueue$$ExternalSyntheticLambda20.run(D8$$SyntheticClass:-1)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.EventQueue.lambda$post$0(EventQueue.java:53)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at com.quickjs.EventQueue$$ExternalSyntheticLambda25.run(D8$$SyntheticClass:-1)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at android.os.Handler.handleCallback(Handler.java:739)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at android.os.Handler.dispatchMessage(Handler.java:95)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at android.os.Looper.loop(Looper.java:135)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65] at android.os.HandlerThread.run(HandlerThread.java:61)
2023-04-15 23:09:16.394 8655-8673/com.game.master.j2v8test A/art: art/runtime/check_jni.cc:65]

运行时so层报错

报错日志

2023-12-25 18:12:39.617 5343-6263/com.hlz.demo.mark A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8 in tid 6263 (QuickJS-1), pid 5343 (.ib.camera.mark) 2023-12-25 18:12:39.878 1027-4530/? E/SDM: CompManager::PrepareStrategyConstraints: PrepareStrategyConstraints,idle_fallback=1, thermal_fallback_=0 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: Process name is com.hlz.demo.mark, not key_process 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: Build fingerprint: 'realme/RMX2051/RMX2051CN:11/RKQ1.201217.002/1647099377877:user/release-keys' 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: Revision: '0' 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: ABI: 'arm64' 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: Timestamp: 2023-12-25 18:12:39+0800 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: pid: 5343, tid: 6263, name: QuickJS-1 >>> com.h l z.mark <<< 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: uid: 10309 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: Cause: null pointer dereference 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: x0 b400007bb38b8100 x1 b400007add15e570 x2 ffffffffffffffff x3 0000007b4eb92330 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: x4 0000007bba9d8a28 x5 0000007bba9d8a48 x6 0000007b4eb92170 x7 0000007b4eb92150 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: x8 0000000000000000 x9 0000000000000000 x10 0000007bbe6bcbd0 x11 0000000000000008 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: x12 0000007b4eb922a0 x13 0000007b4eb92230 x14 0000000000000000 x15 0000000000000001 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: x16 0000007bbe77ac50 x17 0000007bbe6bcb74 x18 0000000000000001 x19 b400007bb38b8100 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: x20 b400007add15e578 x21 b400007bb38b8198 x22 0000000000000000 x23 0000000000000010 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: x24 0000000000000001 x25 b400007bc64e3d38 x26 b400007add4e0190 x27 0000000000000000 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: x28 0000000000000000 x29 0000007b6e670e20 2023-12-25 18:12:39.966 6609-6609/? A/DEBUG: lr 0000007bbe6e996c sp 0000007b6e670e00 pc 0000007bbe6bcbe8 pst 0000000080001000 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: backtrace: 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #00 pc 0000000000035be8 /data/app/~~8HamuObff_73LLzw57cUpg==/com.hlz.demo.mark-vVSoF19id1FLGbgOEmpGMw==/lib/arm64/libquickjs.so (__JS_FreeValueRT+116) (BuildId: 058f4040780ee9252f5d0c27c36356dd9aa011c3) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #01 pc 0000000000062968 /data/app/~~8HamuObff_73LLzw57cUpg==/com.hlz.demo.mark-vVSoF19id1FLGbgOEmpGMw==/lib/arm64/libquickjs.so (BuildId: 058f4040780ee9252f5d0c27c36356dd9aa011c3) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #02 pc 0000000000064d98 /data/app/~~8HamuObff_73LLzw57cUpg==/com.hlz.demo.mark-vVSoF19id1FLGbgOEmpGMw==/lib/arm64/libquickjs.so (BuildId: 058f4040780ee9252f5d0c27c36356dd9aa011c3) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #03 pc 0000000000035c54 /data/app/~~8HamuObff_73LLzw57cUpg==/com.hlz.demo.mark-vVSoF19id1FLGbgOEmpGMw==/lib/arm64/libquickjs.so (__JS_FreeValueRT+224) (BuildId: 058f4040780ee9252f5d0c27c36356dd9aa011c3) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #04 pc 00000000000a89c4 /data/app/~~8HamuObff_73LLzw57cUpg==/com.hlz.demo.mark-vVSoF19id1FLGbgOEmpGMw==/oat/arm64/base.odex (art_jni_trampoline+164) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #05 pc 00000000021978c0 /memfd:jit-cache (deleted) (offset 0x2000000) (com.quickjs.EventQueue.lambda$_releasePtr$15$EventQueue+96) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #06 pc 0000000002197b8c /memfd:jit-cache (deleted) (offset 0x2000000) (com.quickjs.-$$Lambda$EventQueue$GXnJGGFzvyXYbYgXX0W6-F1vQYY.run+108) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #07 pc 00000000020c0b0c /memfd:jit-cache (deleted) (offset 0x2000000) (com.quickjs.EventQueue.lambda$postVoid$1$EventQueue+140) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #08 pc 00000000020c2fbc /memfd:jit-cache (deleted) (offset 0x2000000) (com.quickjs.-$$Lambda$EventQueue$9q9qVcE2GlOF6r852nMR2uKwJrs.run+124) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #09 pc 0000000002122a64 /memfd:jit-cache (deleted) (offset 0x2000000) (android.os.Handler.handleCallback+68) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #10 pc 00000000021504e0 /memfd:jit-cache (deleted) (offset 0x2000000) (android.os.Handler.dispatchMessage+64) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #11 pc 0000000002065978 /memfd:jit-cache (deleted) (offset 0x2000000) (android.os.Looper.loop+2072) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #12 pc 00000000001337e8 /apex/com.android.art/lib64/libart.so (art_quick_invoke_static_stub+568) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #13 pc 00000000001a8a94 /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+228) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #14 pc 0000000000318288 /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)+376) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #15 pc 000000000030e5b4 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+996) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #16 pc 0000000000680034 /apex/com.android.art/lib64/libart.so (MterpInvokeStatic+548) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #17 pc 000000000012d994 /apex/com.android.art/lib64/libart.so (mterp_op_invoke_static+20) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #18 pc 00000000003d2eb4 /system/framework/framework.jar (offset 0x97f000) (android.os.HandlerThread.run+56) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #19 pc 0000000000305bb0 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.llvm.17481138192350454783)+268) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #20 pc 000000000066bdf4 /apex/com.android.art/lib64/libart.so (artQuickToInterpreterBridge+780) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #21 pc 000000000013cff8 /apex/com.android.art/lib64/libart.so (art_quick_to_interpreter_bridge+88) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #22 pc 0000000000133564 /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+548) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #23 pc 00000000001a8a78 /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+200) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #24 pc 000000000055581c /apex/com.android.art/lib64/libart.so (art::JValue art::InvokeVirtualOrInterfaceWithJValues<art::ArtMethod*>(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, art::ArtMethod*, jvalue const*)+460) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #25 pc 00000000005a4b80 /apex/com.android.art/lib64/libart.so (art::Thread::CreateCallback(void*)+1308) (BuildId: 5fc46038f91aa117c85260cbdc94cd1b) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #26 pc 00000000000da278 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64) (BuildId: e81bf516b888e895d4e757da439c8117) 2023-12-25 18:12:40.086 6609-6609/? A/DEBUG: #27 pc 000000000007a448 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: e81bf516b888e895d4e757da439c8117)

Guide

what is file name as 2nd param do? whem the code is in first param

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.