如何表示来自 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* 返回的主要内容,如果未能解决你的问题,请参考以下文章

如何内部连接来自不同数据上下文的表? [复制]

构建日历时如何分离逻辑和表示代码?

如何使用来自 Kafka 的 Python 解码/反序列化 Avro

如何使用mapreduce实现两表join

我们如何根据状态图更改 3D 动画对象(代理表示)颜色?

atoi() 来自十六进制表示字符串