forked from bellard/quickjs
-
Notifications
You must be signed in to change notification settings - Fork 0
06. How Create a C Module
Gurigraphics edited this page Mar 22, 2022
·
2 revisions
Create file: my_module.js
import * as myModule from 'my_module'
const value = myModule.plus(1, 2)
console.log("Result:", value)
// Output => Result: 3Create file: my_module.c
#include "quickjs.h"
#include "cutils.h"
static JSValue plusNumbers(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv)
{
int a, b;
if (JS_ToInt32(ctx, &a, argv[0]))
return JS_EXCEPTION;
if (JS_ToInt32(ctx, &b, argv[1]))
return JS_EXCEPTION;
return JS_NewInt32(ctx, a + b);
}
static const JSCFunctionListEntry js_my_module_funcs[] = {
JS_CFUNC_DEF("plus", 2, plusNumbers),
};
static int js_my_module_init(JSContext *ctx, JSModuleDef *m)
{
return JS_SetModuleExportList(ctx, m, js_my_module_funcs, countof(js_my_module_funcs));
}
JSModuleDef *js_init_module_my_module(JSContext *ctx, const char *module_name)
{
JSModuleDef *m;
m = JS_NewCModule(ctx, module_name, js_my_module_init);
if (!m)
return NULL;
JS_AddModuleExportList(ctx, m, js_my_module_funcs, countof(js_my_module_funcs));
return m;
}Generate file: my_module.o
gcc -c my_module.cAdd to "lib objects list" in Makefile
QJS_LIB_OBJS= ... $(OBJDIR)/my_module.oAdd my_module to file qjsc.c. After "std" and "os" modules
/* add system modules */
namelist_add(&cmodule_list, "std", "std", 0);
namelist_add(&cmodule_list, "os", "os", 0);
// our module
namelist_add(&cmodule_list, "my_module", "my_module", 0);Generate a new compiler qjsc.exe
make qjsc LDEXPORT="-static -s"Generate file: my_module_js.c
qjsc -e -m -o my_module_js.c my_module.js Generate file: my_module.exe
gcc -D_GNU_SOURCE -I./ -o my_module my_module_js.c -static -s -L./ -lquickjs -lm -ldl -lpthreadif error: no found quickjs or no found js_init_module_my_module, Make clean and repeat
Make clean| Writing native modules in C for QuickJS engine | https://calbertts.medium.com/writing-native-modules-in-c-for-quickjs-engine-49043587f2e2 |