【问题标题】:How to use C++ allocated array in Emscripten generated code?如何在 Emscripten 生成的代码中使用 C++ 分配的数组?
【发布时间】:2016-06-13 23:37:12
【问题描述】:

我有一个这样的 C++ 代码:

extern "C" {

void MyCoolFunction (int** values)
{
    int howManyValuesNeeded = 5;
    *values = new int[howManyValuesNeeded];
    for (int i = 0; i < howManyValuesNeeded; i++) {
        (*values)[i] = i;
    }
}

}

在 C++ 中可以这样使用:

int *values = NULL;
MyCoolFunction (&values);
// do something with the values
delete[] values;

当然真正的代码要复杂得多,但关键是函数在里面分配了一个int数组,它决定了数组的大小。

我用 Emscripten 翻译了这段代码,但我不知道如何从 javascript 访问函数内部分配的数组。 (我已经知道如何在 Emscripten 生成的代码中使用导出函数和指针参数,但我不知道如何解决这个问题。)

有什么想法吗?

【问题讨论】:

  • “我不知道如何访问数组” – 但是您显示的代码正是这样做的。你有什么问题?
  • 我的问题是emscripten转换后如何从javascript访问数组。
  • 请将其添加到您的问题中。目前还不清楚,至少对我来说是这样。再看看“from C it can be used...”,C中没有delete[]
  • 我更新了问题,并将 C 替换为 C++。
  • 好吧,我收回了我的关闭作为“不清楚你在问什么”投票。

标签: javascript c++ c emscripten


【解决方案1】:

在 Emscripten 中,内存存储为一个巨大的整数数组,而指针只是该数组的索引。因此,您可以像处理整数一样在 C++ 和 Javascript 之间来回传递指针。 (听起来您知道如何传递值,但如果不知道,请转到here。)

好的。现在,如果您在 C++ 端创建一个指针(如上面的代码)并将其传递给 Javascript,Emscripten 提供了一些帮助函数来允许您访问该内存。特别是setValuegetValue

因此,如果您将 values 变量传递给 JS,并且您想访问索引 5,您可以使用以下方法:

var value5 = getValue(values+(5*4), 'i32');

您必须将索引乘以字节数 (5*4) 添加到指针,并指明数组的类型(在本例中为 32 位整数)。

【讨论】:

  • 谢谢!这正是我所知道的。如果有人感兴趣,这里是我所有的指针实验:github.com/kovacsv/EmscriptenPointers
  • 如果可以选择更改函数签名,则可以使用 std::vector 代替数组。使用 embind 传递 std::vectors 非常简单
【解决方案2】:

您可以通过将 JavaSCript 包装在另一个导出函数中来调用删除。

extern "C" { ...
    void MyCoolFunction (int** values);
    void finsih_with_result(int*);
}

void finsih_with_result(int *values) {
    delete[] values;
}

或者,您也可以直接在 JavaScript 端执行此操作:Module._free(Module.HEAPU32[values_offset/4])(或类似的东西;代码未经测试)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 2012-09-03
    • 2016-03-25
    • 2021-11-04
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多