暖夏少年|「实操演示」比肩V8的QuickJS入门指南( 二 )
os模块:提供了操作系统特定的 低级文件访问、信号、计时器、异步IO、线程 方法
open、close、seek、read、write、isatty、ttyGetWinSize、ttySetRaw、remove、rename、realpath、getcwd、chdir、mkdir、stat、lstat、utimes、symlink、readlink、readdir、setReadHandler、setWriteHandler、signal、kill、exec、waitpid、WNOHANG、dup、dup2、pipe、sleep、setTimeout、clearTimeout、platform、Worker
UnicodeQuickJS实现了特定的Unicode库,不用依赖外部的大型Unicode库(比如ICU) 。 所有的Unicode表都经过了压缩来提高访问速度(果然神级程序员) 。
如何自己扩展 QuickJS C APIC API的设计简单有效,C API在 quickjs.h中进行定义
JS数据类型的C定义以下结构定义在quickjs.h文件中
typedef struct JSValue {JSValueUnion u;//用来存放指针或数组int64_t tag;} JSValue;typedef union JSValueUnion {void *ptr;//指针int32_t int32;//整型double float64;//浮点} JSValueUnion;编写一个C模块关键点在于定义API函数的入口、定义初始化的回调函数并暴露处理、定义初始化模块方法(系统自动调用 , 这个函数名称只能遵循qjs的规则)
// 创建文件 test.c#include "quickjs.h"#include "stdio.h"#include "stdlib.h"#define len(x) (sizeof(x) / sizeof((x)[0]))// 功能函数,实现你的具体功能的C函数static double test_add(int a, double b){return a + b;}// *ctx=上下文;this_val=this对象;argc=参数个数; *argv=参数列表static JSValue js_test_add(JSContext *ctx, JSValueConst this_val,int argc, JSValueConst *argv){int a;double b;if (JS_ToInt32(ctx,}if (JS_ToFloat64(ctx,}return JS_NewFloat64(ctx, test_add(a, b)); } // js函数入口名称及列表static const JSCFunctionListEntry js_test_funcs[] = {// 表示入口名称是testAdd,2个参数 , 调用内部哪个函数JS_CFUNC_DEF("testAdd", 2, js_test_add), };// 初始化的回调方法(由系统调用),将函数入口列表暴露出来static int js_test_init(JSContext *ctx, JSModuleDef *m){return JS_SetModuleExportList(ctx, m, js_test_funcs, len(js_test_funcs));}// 模块初始化,由系统调用,名称和参数不可修改,遵循qjs的规则JSModuleDef *js_init_module(JSContext *ctx, const char *module_name){JSModuleDef *module;module = JS_NewCModule(ctx, module_name, js_test_init);if (!module){ return NULL; }JS_AddModuleExportList(ctx, module, js_test_funcs, len(js_test_funcs));return module;}gcc test.c libquickjs.a-fPIC -shared -o test.so// 萧鸣注: 这里会碰到一个坑,可能在编译期间会提示你:// libquickjs.a无法创建动态链接库,要使用 -fPIC进行编译// what?我不是用了 -fPIC参数了吗?实际上这里说的是整个qjs源码make时要加入-fPIC参数// 我们找到源码里的makefile,打开找到以下内容...HOST_CC=gccCC=$(CROSS_PREFIX)gccCFLAGS=-g -Wall -MMD -MF $(OBJDIR)/$(@F).d...将其CFLAGS行中的参数添加-fPIC 如下:...HOST_CC=gccCC=$(CROSS_PREFIX)gccCFLAGS=-g -Wall -MMD -fPIC-MF $(OBJDIR)/$(@F).d...// 然后make clean 然后重新 make && make install// 然后就可以重复上一步,进行test.so的编译了在js脚本中调用这个动态链接库
import { testAdd} from 'test.so'console.log(`萧鸣测试 testAdd(200,10.5)`)console.log(`结果等于: ${testAdd(200, 10.5)}`)执行后得到以下结果
总结经过本人亲手试验, QuickJS可以灵活地使用在一些嵌入式程序之中 , 因为体积小可以嵌入到单片机中使用 , 通过自己扩展c方法 , 提供js对单片机的控制 。
推荐阅读
- 金戈鐵馬|特朗普力挺铁杆支持者,枪杀两人的少年没错?抗议活动不断发酵
- 开封于七一|育迎宾尚法好少年,借温柔秋风多送法
- 少年|央视要搞选秀,热搜沸了!网友提名他当导师,点赞数第一
- 暖夏少年|2020电脑硬盘销量排行榜:七彩虹加入战局,硬是打倒了金士顿
- 少年一梦|2020畅销手机排行,iPhone无人超越,安卓旗舰全线溃败
- 少年帮|进入倒计时,华为突然宣布,供应链将迎来“洗牌”?
- 少年帮|纯国产“龙芯”即将来临,正式确认?中科院宣布决定
- 上线|原创央视也搞成团选秀!《上线吧!华彩少年》有哪些优势?粉丝放心了
- 海报|央视首档少年成团选秀节目《上线吧!华彩少年》开始全球招募
- 少年帮|正式确认?中科院宣布决定,纯国产“龙芯”即将来临
