2017-10-18 7 views
0

WebAssemblyのWebサイトとチュートリアルがありましたが、少し失われてしまいました。WebAssembly用にemscriptenでコンパイルしたCコードに文字列を渡す方法

私は、次のCコードを持っている:私が理解から

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

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

私は(私もこの部分に行くための最善の方法であるか分からない)でそれをコンパイルします私は今、javascriptクラスのdemo.jsグルーコードを使用して、その方法を呼び出します:

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

私が見ているもの

(null) 

は私がWebAssemblyでコンパイルされたCコードに文字列値を渡すために欠けているものがあります:私は方法がある呼び出したときに、コンソールに印刷されたNG?

ありがとうございました

+1

「hello」と「_stringify」とは何ですか、あなたはどこにそれらを呼び出しますか? – Bergi

+0

これはtypoですが、それは_hello(value.innerHTML)である必要があります。私は質問を編集しました。ごめんなさい – ElCapitaine

+0

jsから呼び出すことができるように関数をエクスポートする必要があります: 'emcc demo.c -01 -s EXPORTED_FUNCTIONS = "['_ main'、 '_hello'] -o demo.js" 'また、苦労していないと気にしないでください。これはすべて新しく重い開発の下にあり、ドキュメントは必ずしも不完全で古いです。 –

答えて

1

実際に私の質問に対する回答が見つかりました。 Emscriptenが自動的に作成する関数を、Glueコード内で自動的に作成する必要がありました。このコードは、C++コードをWASMにビルドするときに生成されます。 Emscripten's page

// 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でWebAssemblyにコンパイルされたC++コードに文字列を渡します。

関連する問題