如何在 Emscripten 生成的代码中使用 C++ 分配的数组?
How to use C++ allocated array in Emscripten generated code?
我有这样的 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 中,内存存储为一个巨大的整数数组,而指针只是该数组的索引。因此,您可以像处理整数一样在 C++ 和 Javascript 之间来回传递指针。 (听起来你知道如何传递值,但如果不知道,请转到 here。)
好的。现在,如果您在 C++ 端创建一个指针(如上面的代码中所示)并将其传递给 Javascript,Emscripten 附带了一些辅助函数以允许您访问该内存。具体来说 setValue and getValue.
因此,如果您将 values 变量传递给 JS 并且您想要访问索引 5,您可以使用类似的方法来实现:
var value5 = getValue(values+(5*4), 'i32');
您必须将索引乘以字节数 (5*4) 添加到指针,并指明数组的类型(在本例中为 32 位整数)。
您可以通过将其包装在另一个导出函数中来调用 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])
(或类似的东西;代码未测试)。
我有这样的 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 中,内存存储为一个巨大的整数数组,而指针只是该数组的索引。因此,您可以像处理整数一样在 C++ 和 Javascript 之间来回传递指针。 (听起来你知道如何传递值,但如果不知道,请转到 here。)
好的。现在,如果您在 C++ 端创建一个指针(如上面的代码中所示)并将其传递给 Javascript,Emscripten 附带了一些辅助函数以允许您访问该内存。具体来说 setValue and getValue.
因此,如果您将 values 变量传递给 JS 并且您想要访问索引 5,您可以使用类似的方法来实现:
var value5 = getValue(values+(5*4), 'i32');
您必须将索引乘以字节数 (5*4) 添加到指针,并指明数组的类型(在本例中为 32 位整数)。
您可以通过将其包装在另一个导出函数中来调用 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])
(或类似的东西;代码未测试)。