如何表示来自 emscripten/webassembly 调用的 void* 返回
Posted
技术标签:
【中文标题】如何表示来自 emscripten/webassembly 调用的 void* 返回【英文标题】:how to represent void* return from emscripten/webassembly call 【发布时间】:2020-09-14 09:11:25 【问题描述】:我有一个像这样导出到 Web 程序集的函数
void* EMSCRIPTEN_KEEPALIVE InitializeLibrary()
SomeStruct s;
s.k = 18;
s.t = 21;
return (void*)&s;
并且函数在后续调用中使用上述返回的结构/指针作为 SDK/API。对于相同的示例 Il,只需创建一个像这样的简单函数
int EMSCRIPTEN_KEEPALIVE Add(void* b)
SomeStruct* bg = (SomeStruct*)b;
return bg->k + bg->t;
问题,使用Module.ccall或cwrap,如何指定函数返回和/或函数参数是void*?
提前致谢。
编辑后,也许这不仅仅是一个 void* 而是返回一个结构指针,并将其作为参数传递回函数。
【问题讨论】:
【参考方案1】:C 指针的 javascript 类型是数字。
var arg = Module.ccall('InitializeLibrary', 'number',[]);
var result = Module.ccall('Add', 'number', ['number'], [arg]);
console.log(arg, result);
并且返回一个指向局部变量的指针是无效的。
void* EMSCRIPTEN_KEEPALIVE InitializeLibrary()
SomeStruct* s = malloc(sizeof(SomeStruct));
s->k = 18;
s->t = 21;
return (void*)s;
【讨论】:
我不明白。如果我有一个函数指针,例如:“void EMSCRIPTEN_KEEPALIVE (*myfunctionpointer)(const char *)”,我该如何使用 cwrap 来调用它? "var myfunction = Module.cwrap("myfunctionpointer", number, ["string"])",然后简单地做"myfunction()"? 函数指针是另一个话题。搜索其他 QA 或创建新问题。以上是关于如何表示来自 emscripten/webassembly 调用的 void* 返回的主要内容,如果未能解决你的问题,请参考以下文章