如何从WebAssembly函数返回JavaScript字符串?
以下模块可以用C(++)编写吗?
export function foo() {
return 'Hello World!';
}
Run Code Online (Sandbox Code Playgroud)
另外:我可以将它传递给JS引擎进行垃圾回收吗?
我是Emscripten/javascript以及Overstack社区的新手.如果我的情况已经得到解决,我会事先道歉.
在Windows 7环境中,我使用emcc编译了一个简单的c程序,它接受一个数组并对其进行修改(见下文).
double* displayArray(double *doubleVector) {
for (int cnt = 0; cnt < 3; cnt++)
printf("doubleVector[%d] = %f\n", cnt, doubleVector[cnt]);
doubleVector[0] = 98;
doubleVector[1] = 99;
doubleVector[2] = 100;
for (int cnt1 = 0; cnt1 < 3; cnt1++)
printf("modified doubleVector[%d] = %f\n", cnt1, doubleVector[cnt1]);
return doubleVector;
}
int main() {
double d1, d2, d3;
double array1[3];
double *array2;
array1[0] = 1.00000;
array1[1] = 2.000000;
array1[2] = 3.000000;
array2 = displayArray(array1);
for (int cntr =0; cntr < 3; cntr++)
printf("array1[%d] …Run Code Online (Sandbox Code Playgroud) 我认为这个问题与这个问题类似,我使用了它的大部分答案来解决我的问题,但我仍然有问题:
首先是C代码:
#include <stdio.h>
extern "C"
{
void fillArray(int* a, int len)
{
for (int i = 0; i<len; i++)
{
a[i] = i*i;
}
for (int j = 0; j < len; ++j)
{
printf("a[%d] = %d\n", j, a[j]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我将一个指向数组的指针传递给我的 C 函数,并用一些信息填充它。我用以下代码编译这段代码
emcc -o writebmp.js dummyCode\cwrapCall.cxx -s EXPORTED_FUNCTIONS="['_fillArray']"
Run Code Online (Sandbox Code Playgroud)
我的 html/js 代码如下:
<!doctype html>
<html>
<script src="writebmp.js"></script>
<script>
fillArray = Module.cwrap('fillArray', null, ['number', 'number']);
var nByte = 4
var length = 20;
var buffer = Module._malloc(length*nByte); …Run Code Online (Sandbox Code Playgroud) 我希望将用户提交的数据传递给已编译为wasm的c ++函数。数据是用户通过输入标签在前端提交的文件,如下所示:
<input type="file" onChange={this.handleFile.bind(this)} />
Run Code Online (Sandbox Code Playgroud)
当前的onChange回调如下所示:
handleFile(e){
const file = e.currentTarget.files[0];
const reader = new FileReader();
reader.onloadend = evt => {
window.Module.readFile(evt.target.result);
}
reader.readAsArrayBuffer(file);
}
Run Code Online (Sandbox Code Playgroud)
最后,包含readFile函数的.cpp文件如下所示:
void readFile(const std::string & rawString){
std::vector<uint8_t> data(rawString.begin(), rawString.end());
//...
}
EMSCRIPTEN_BINDINGS(my_module) {
emscripten::function("readFile", &readFile);
}
Run Code Online (Sandbox Code Playgroud)
我花了一个下午的时间阅读各种文档,因此我知道应该为堆上的这些文件分配内存,然后将ptr从js传递到readFile而不是传递所有数据。我的问题是,我只是不太了解所有这些工作原理。有人可以解释吗?