2017-10-18 150 views
0

我一直在寻找一个WebAssembly网站和教程,我感觉有点失落。如何将字符串传递给用emscripten编译为WebAssembly的C代码

我有以下的C代码:

void EMSCRIPTEN_KEEPALIVE hello(char * value){ 
    printf("%s\n", value); 
} 

我编译它(我也不能肯定这部分是最好的方式去):

emcc demo.c -s WASM=1 -s NO_EXIT_RUNTIME=1 -o demo.js 

从我的理解我现在可以在我的JavaScript类中使用demo.js胶合代码并调用该方法:

... 
<script src="demo.js"></script> 
<script> 
    function hello(){   
     // Get the value 
     var value = document.getElementById("sample"); 
     _hello(value.innerHTML); 
    } 
</script> 
... 

我看到的是bei吴印在控制台当我打电话的方法是:

(null) 

有我丢失的东西传递一个字符串值的C代码编译WebAssembly?

非常感谢

+1

什么是“hello”和“_stringify”,你在哪里给他们打电话? – Bergi

+0

这是一个错字,它应该是_hello(value.innerHTML),我编辑了这个问题,对不起 – ElCapitaine

+0

请注意,您必须导出函数才能够从js调用它们:'emcc demo.c -01 -s EXPORTED_FUNCTIONS =“['_ main','_hello'] -o demo.js”'对于挣扎也不感到厌烦,这是全新的并且处于沉重的发展阶段,文档必然不完整且过时。 –

回答

1

我居然找到了一个回答我的问题。我只需使用Emscripten自动在“Glue”代码中构建的函数,这些代码在将C++代码构建到WASM时也会生成。

所以基本上,传递一个字符串C++代码编译成WebAssembly与Emscripten你只是做这样的:

// Create a pointer using the 'Glue' method and the String value 
var ptr = allocate(intArrayFromString(myStrValue), 'i8', ALLOC_NORMAL); 

// Call the method passing the pointer 
val retPtr = _hello(ptr); 

// Retransform back your pointer to string using 'Glue' method 
var resValue = Pointer_stringify(retPtr); 

// Free the memory allocated by 'allocate' 
_free(ptr); 

Emscripten's page更为完整的信息。

相关问题