引言
QuickJS 是一个轻量级的 JS 引擎,是作者 Fabrice Bellard 大神一人力作,根据作者本人的介绍,这是一个比较完备的引擎,不仅支持了 ES2020 的规范,还支持模块/异步生成/科学计算等等。
由于 QuickJS 是由 C 语言写的,所有天生具有跨平台的特性,又因为 QuickJS 仅仅保留了最基本的引擎特性,也可以保证 QuickJS 的库是比较精简的,更加适合接入到嵌入式等内存敏感的设备。
又有作者测试的 QuickJS 性能介于 javascript core 和 v8 之间,这个性能也是可接受的。
Android 接入
Android 将 QuickJS 引擎接入到自己的 APP 或者 SDK 中时有两种常用方式。
第一种是以源码的形式接入到自己的 target 里,这种方式比较方便;
第二种是根据作者在 github 的最新 release 代码编译出动态链接库接入,这种方式接入更加与业务代码解耦,方便后续该模块的升级与更新最新代码;
源码接入
源码方式接入 QuickJS 代码只需要将 github 的代码 clone 到本地,然后在自己的模块中增加对应的文件夹,最后通过在自己的项目中 makelist 中增加对这个文件夹的编译索引。
在成功编译后就可以在自己的代码中通过导入对应的的头文件来使用 QuickJS 引擎了。
源码接入优缺点
通过源码方式接入的方式的优点比较明显,就是接入时比较简单,通过将核心实现代码和头文件接入到自己的工程中就可以直接使用。
但是这种方式的缺点更加明显,通过这种方式接入时如果要针对 QuickJS 进行优化,就需要对整个工程进行编译;同时会将依赖的三方库和项目工程有较大的耦合,如果项目中有别的工程也需要依赖 QuickJS 库就会有编译冲突等等。
综上,不建议进行源码依赖的方式进行接入,但是前期为了验证功能等是可以进行快速校验时还可以。
动态链接库接入
动态链接库方式的接入,首先需要准备对应的链接库,这里就需要使用 QuickJS 代码去编译生成对应的动态链接库。这里使用的编译方式是通过使用 Android Studio 加 makelist 去完成。
在自己的 SDK 或者 APP 中增加对应的模块,然后编写对应的 makelist 文件,在编写这个 cmake 的时候有几点是需要注意。
1, 声明自己编译所需要的核心实现类。
set(QUICKJS_LIB_SOURCES
qjs1/quickjs.c
qjs1/libregexp.c
qjs1/libunicode.c
qjs1/libbf.c
qjs1/cutils.c
)
2, 做一些声明以及配置
project(qjs1 C)
option(LEAK_TRIGGER "Add a leak trigger" FALSE)
3, 增加公开头文件的声明
set(QUICKJS_PUBLIC_HEADERS
qjs1/cutils.h
qjs1/libregexp.h
qjs1/quickjs.h
qjs1/quickjs-atom.h
qjs1/quickjs-opcode.h
)
4, 可选是否链接 Android log 库
find_library( # Sets the name of the path variable.
log-lib
log)
target_link_libraries(
qjs1
${log-lib}
)
5, 在 build gradle 文件中指定要编译的 cmakelist 文件
externalNativeBuild {
cmake {
path "test/useqjs/CMakeLists.txt"
version "3.10.2"
}
}
至此已经完成了 QuickJS 源码编译为动态链接库的准备条件,这里只要准备好对应的 NDK 版本即可,最后从产物中选取自己需要的 abi 产物即可。
编译产物:
.//intermediates/stripped_native_libs/release/out/lib/armeabi-v7a/libqjs.so .//intermediates/stripped_native_libs/release/out/lib/arm64-v8a/libqjs.so
接入动态链接库
经过上述过程之后可以得到动态链接库对应的 so 产物,然后将上述产物放到对应的 libs 文件夹中,然后在自己的 CPP 项目中导入对应的 so 以及增加对应的头文件。
对应的 CMakelist 如下:
target_link_libraries( # Specifies the target library.
test-qjs
${log-lib}
${CMAKE_CURRENT_SOURCE_DIR}/libs/${ANDROID_ABI}/libqjs.so
)
此时,就完成了通过动态链接库接入 QuickJS 的整体流程。
动态库接入优缺点
通过动态链接库接入的方式优缺点正好和源码方式反过来。但是缺点也不如源码方式的明显。
缺点就是需要自己编一个链接库,但是后面的收益更大。
之后更换动态库或者将这个库在 APP 内横向共享会更加方便,也方便后续对动态库的升级等。
小结
本文主要介绍了 QuickJS 引擎,也从 Android 事件角度解析了如何为自己的 SDK 或者 App 引入 QuickJS 引擎的两种方式,同时分析了两种接入方式的优缺点。
希望通过这篇文章可以帮助想要接入 QuickJS 的同行们有些许帮助。
网友评论