如何表示void *从emscripten / webassembly调用返回

问题描述

我有一个这样的功能可以导出到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 *,而且还会返回结构指针,并将其作为参数传递回函数

解决方法

JavaScript的C指针类型是数字。

var arg = Module.ccall('InitializeLibrary','number',[]);
var result = Module.ccall('Add',['number'],[arg]);
console.log({arg,result});

返回指向本地变量的指针无效。

void* EMSCRIPTEN_KEEPALIVE InitializeLibrary(){
  SomeStruct* s = malloc(sizeof(SomeStruct));
  s->k = 18;
  s->t = 21;
  return (void*)s;
}