我一直在尝试使用 Emscripten 将 C++ API 引入 Web 程序集。
我已经成功地能够将单个函数和类从我的 API 导出到 JS 模块,但我不太确定如何将方法的完整命名空间嵌入到它们自己的 JS 对象中。
假设我有NamespaceA
和NamespaceB
(下面的粗略示例),我如何将这些命名空间中的方法“嵌入”到主绑定中它们自己的 JS 对象?
// Example namespace A
#include "myheaderfile_a.h"
uint8_t NamespaceA::functionA(uint8_t a, uint8_t b) {
return a+b;
}
uint8_t NamespaceA::functionB(uint8_t a, uint8_t b) {
return a+b*2;
}
uint8_t NamespaceA::functionC(uint8_t a, uint8_t b) {
return b - a;
}
// Example namespace B
#include "myheaderfile_b.h"
uint8_t NamespaceB::functionA(uint8_t a, uint8_t b) {
return a+b;
}
uint8_t NamespaceB::functionB(uint8_t a, uint8_t b) {
return a+b*2;
}
uint8_t NamespaceB::functionC(uint8_t a, uint8_t b) {
return b - a;
}
我在 Javascript 中寻找如下使用结构:
const MyModule = require("binding.js");
MyModule.addOnPostRun(() => {
console.log(MyModule);
// NAMESPACE A
MyModule.NamespaceA.functionA(6, 4);
MyModule.NamespaceA.functionB(6, 4);
MyModule.NamespaceA.functionC(6, 4);
// NAMESPACE B
MyModule.NamespaceB.functionA(6, 4);
MyModule.NamespaceB.functionB(6, 4);
MyModule.NamespaceB.functionC(6, 4);
});
我将如何实现这一目标?
我尝试导出 avalue_object
但似乎我无法将命名空间用作类型。即便如此,我认为尝试将函数导出为字段是不正确的:
EMSCRIPTEN_BINDINGS()
{
value_object<NamespaceA>("NamespaceA")
.field("functionA", &NamespaceA::functionA)
.field("functionB", &NamespaceA::functionB)
.field("functionC", &NamespaceA::functionC)
};