C++ API 参考
公开头文件:engine.h。以下示例均使用 Emjs::JsEngine 类。
创建 / 销毁
// 调用方提供缓冲区(destroy 时不释放)
char mem[8192];
JsEngine* js = JsEngine::create(mem, sizeof(mem));
JsEngine::destroy(js);
// 引擎内部分配(destroy 时释放)
JsEngine* js2 = JsEngine::create(8192);
JsEngine::destroy(js2);
执行 JavaScript
JsValue v = js->eval("1+2+3");
const char* s = js->str(v); // "6" 或错误信息
callGlobal — 比 eval 调用字符串更高效
js->eval("function add(a,b){return a+b;};");
JsValue argv[2] = {JsEngine::makeNumber(10), JsEngine::makeNumber(32)};
JsValue r1 = js->callGlobal("add", argv, 2); // 42
JsValue r2 = js->callGlobal("add", {
JsEngine::makeNumber(1),
JsEngine::makeNumber(2),
}); // 3
错误情况:bad call、'name' not found、'name' not callable。
注入原生 C++ 函数
JsValue add(JsEngine* js, JsValue* args, int nargs) {
if (!JsEngine::chkArgs(args, nargs, "dd"))
return js->makeError("type mismatch");
return JsEngine::makeNumber(
JsEngine::getNumber(args[0]) + JsEngine::getNumber(args[1]));
}
js->set(js->glob(), "add", JsEngine::makeFunction(add));
chkArgs 格式字符
| 字符 | 类型 |
|---|---|
d | number |
b | boolean |
s | string |
j | 任意 JS 值 |
值工厂方法
makeUndefined()、makeNull()、makeTrue()、makeFalse()makeNumber(double)、makeString(data, len)makeFunction(NativeFunction)、makeObject()makeError(format, ...)
运行时控制
js->setGcThreshold(1024);
js->setMaxCss(5000);
js->gc();
size_t total=0, lwm=0, css=0;
js->stats(&total, &lwm, &css);
对象属性
JsValue obj = js->makeObject();
js->set(obj, "answer", JsEngine::makeNumber(42));
js->set(js->glob(), "cfg", obj);