ZBLOG

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

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

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

// math.js

function add(a, b) {
  return a + b;
}

function multiply(a, b) {
  return a * b;
}

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

#include <emscripten.h>
#include <emscripten/bind.h>

using namespace emscripten;

// 定义一个 MathLibrary 类用于导出 JavaScript 函数
class MathLibrary {
public:
    static int add(int a, int b) {
        EM_ASM({
            // 调用全局作用域下的 add() 函数,并将结果存储到内存中
            Module.add_result = add($0, $1);
        }, a, b);

        // 从内存中获取结果并返回
        return EM_ASM_INT({
            return Module.add_result;
        });
    }

    static int multiply(int a, int b) {
        EM_ASM({
            // 调用全局作用域下的 multiply() 函数,并将结果存储到内存中
            Module.multiply_result = multiply($0, $1);
        }, a, b);

        // 从内存中获取结果并返回
        return EM_ASM_INT({
            return Module.multiply_result;
        });
    }
};

EMSCRIPTEN_BINDINGS(math_library) {
    class_<MathLibrary>("MathLibrary")
        .class_function("add", &MathLibrary::add)
        .class_function("multiply", &MathLibrary::multiply);
}

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

#include <iostream>
#include "math_library.h"

int main() {
    // 在 C++ 中调用 JavaScript 函数
    int result = MathLibrary::add(2, 3);
    std::cout << "Addition result: " << result << std::endl;

    result = MathLibrary::multiply(4, 5);
    std::cout << "Multiplication result: " << result << std::endl;

    return 0;
}

最后,通过将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

注册

已经有帐号?