Recently, I am working on a project that involves WebAssembly. In the project I would need to call out a JavaScript function with a C string char *string as parameter.
I could not get the string in JavaScript function, searching on the internet does not result in any useful information. None of the solutions I found are elegant. Then I realized I had used the WebSocket APIs from Emscripten, which is passing the URL as a C string to the underline JavaScript support function. How does it do that? I digged out the source of it and found in function emscripten_websocket_new, it is using UTF8ToString to convert the C string to a JavaScript String. UTF8ToString is Emscripten's runtime function, I could not call it directly from my JavaScript function.
According to the preamble.js document,
I would need to use -s 'EXTRA_EXPORTED_RUNTIME_METHODS=["UTF8ToString"]'
on the linker command to
export the function and use it as Module.UTF8ToString
. Problem solved.
Below are sample code that demonstrate the usage:
JavaScirpt function:
function processing_string_from_c(ptr, len) { var text = Module.UTF8ToString(ptr, len); .... }In the C code:
char *string; ... EM_ASM({process_string_from_c($0, $1);}, string, strlen(string)); ...And in the linker line, remember to use
-s 'EXTRA_EXPORTED_RUNTIME_METHODS=["UTF8ToString"]'P.S. In the latest release of emscripten, the export functions become global scope. So calls would be
UTF8ToString()
directly.