在Webassembly模块中使用字符串

时间:2017-05-31 11:43:35

标签: webassembly

我试图让这个简单的方案有效,但我无法理解如何从内存中获取数据:

在hello.cpp中:

void EMSCRIPTEN_KEEPALIVE modifyDOM(const char *text, const char *id) {
    printf("modify dom %s with %s\n", id, text);
    EM_ASM_({
        console.log($0);
        console.log($1);
        console.log(arguments);
        const elt = document.getElementById($0);
        elt.innerHTML = $1;
    }, id, text);
}
hello.html中的

document.querySelector('.addDom').addEventListener('click', function(){
    Module.ccall('modifyDOM', null, ['string', 'string'], ['Some fun text', 'textDom']);
});

我得到的是printf输出正确的值(即使用一些有趣的文本修改dom textDom),但console.log输出的数字如6736和6672.

我想这是因为在Javascript世界中,这些值像内存中的指针一样存储。如果是这样的话,将这些值作为字符串的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

是的,这些都是指针。 emscripten生成的Javascript粘贴文件为您提供了一个帮助函数,用于将指向空终止的ASCII编码字符串的指针转换为Javascript String对象:Module.AsciiToString(ptr)

还有UTF8ToStringUTF16ToStringUTF32ToString