1

我一直在尝试使用 Emscripten 将 C++ API 引入 Web 程序集。

我已经成功地能够将单个函数和类从我的 API 导出到 JS 模块,但我不太确定如何将方法的完整命名空间嵌入到它们自己的 JS 对象中。

假设我有NamespaceANamespaceB(下面的粗略示例),我如何将这些命名空间中的方法“嵌入”到主绑定中它们自己的 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)
};
4

0 回答 0