ZBLOG

emscripten C++中调用js库实例 不使用EM_ASM相关宏

如果你不想使用EM_ASM相关宏来在C++中直接调用JavaScript代码,你可以考虑使用Emscripten提供的绑定机制和JS API来实现。下面是一个示例:

假设有一个名为math.js的JavaScript库,其中包含了两个函数:add()multiply()

  1. // math.js
  2. function add(a, b) {
  3. return a + b;
  4. }
  5. function multiply(a, b) {
  6. return a * b;
  7. }

首先,在C++中创建一个绑定类,该类将会导出JavaScript函数并与C++代码进行交互。例如,我们创建一个名为MathLibrary的绑定类。

  1. #include <emscripten.h>
  2. #include <emscripten/bind.h>
  3. using namespace emscripten;
  4. // 定义一个 MathLibrary 类用于导出 JavaScript 函数
  5. class MathLibrary {
  6. public:
  7. static int add(int a, int b) {
  8. EM_ASM({
  9. // 调用全局作用域下的 add() 函数,并将结果存储到内存中
  10. Module.add_result = add($0, $1);
  11. }, a, b);
  12. // 从内存中获取结果并返回
  13. return EM_ASM_INT({
  14. return Module.add_result;
  15. });
  16. }
  17. static int multiply(int a, int b) {
  18. EM_ASM({
  19. // 调用全局作用域下的 multiply() 函数,并将结果存储到内存中
  20. Module.multiply_result = multiply($0, $1);
  21. }, a, b);
  22. // 从内存中获取结果并返回
  23. return EM_ASM_INT({
  24. return Module.multiply_result;
  25. });
  26. }
  27. };
  28. EMSCRIPTEN_BINDINGS(math_library) {
  29. class_<MathLibrary>("MathLibrary")
  30. .class_function("add", &MathLibrary::add)
  31. .class_function("multiply", &MathLibrary::multiply);
  32. }

然后,在C++代码的其他部分中,你可以直接使用MathLibrary类来调用JavaScript函数,而无需使用EM_ASM宏。

  1. #include <iostream>
  2. #include "math_library.h"
  3. int main() {
  4. // 在 C++ 中调用 JavaScript 函数
  5. int result = MathLibrary::add(2, 3);
  6. std::cout << "Addition result: " << result << std::endl;
  7. result = MathLibrary::multiply(4, 5);
  8. std::cout << "Multiplication result: " << result << std::endl;
  9. return 0;
  10. }

最后,通过将C++代码编译为WebAssembly模块,并在HTML页面中引入生成的JavaScript文件,你就可以在浏览器中运行并调用JavaScript库中的函数了。

请注意,在上述示例中,我们仍然使用了EM_ASM宏来实现从JavaScript函数返回结果到C++的传递。但是这只发生在绑定类内部,并且在C++的其他部分中我们并没有使用EM_ASM宏。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=15180

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?