收藏
回答

wasm的胶水js该如何修改以适配WXWebAssembly?

比如一个最简单的hello world cpp通过Emscripten编译成hello.wasm和胶水js:hello.js.

//hello.cc
#include <stdio.h>


#ifndef EM_PORT_API
#   if defined(__EMSCRIPTEN__)
#       include <emscripten.h>
#       if defined(__cplusplus)
#           define EM_PORT_API(rettype) extern "C" rettype EMSCRIPTEN_KEEPALIVE
#       else
#           define EM_PORT_API(rettype) rettype EMSCRIPTEN_KEEPALIVE
#       endif
#   else
#       if defined(__cplusplus)
#           define EM_PORT_API(rettype) extern "C" rettype
#       else
#           define EM_PORT_API(rettype) rettype
#       endif
#   endif
#endif


EM_PORT_API(int) show_me_the_answer() {
    return 42;
}


EM_PORT_API(float) add(float a, float b) {
    return a + b;
}


int main() {
    printf("Hello World-\n");
    return 0;
}


在普通的html中可以顺利调用:

    <script>
        Module = {};
        Module.onRuntimeInitialized = function() {
            //do sth.
            Module._main();
            console.log(Module._add(12, 1.0));
        }
    </script>
    <script src="hello.js"></script>

在小程序中似乎只WXWebAssembly.instantiate(path, imports)

请问该如何修改胶水js以适配呢?WebAssembly.RuntimeError等需要修改成WXWebAssembly.xxx吗?

能否帮忙提供一个小程序调用c++ 转化的wasm的最小示例?谢谢!

(或者说小程序还提供其他更方便地使用c++进行密集运算的方式吗?)


回答关注问题邀请回答
收藏

1 个回答

  • sine
    sine
    2021-11-24

    你好。解决办法有几个:

    1. C++代码里尽量不要引用内置库,比如上面的 #include <stdio.h> 。这样的好处是可以减少emcc生成的胶水代码的量
    2. emcc编译时选择精简的编译模式,避免emcc编译时自动引入了一些不需要的库
    3. 最后手动修改胶水代码,以适配小程序环境,比如 WebAssembly 适配为 WXWebAssembly
    4. 如果C++代码足够纯净,只用来做运算的话,那理论上emcc编译后主要产物是wasm文件,胶水js里只有很少的代码量
    2021-11-24
    有用 2
    回复 4
登录 后发表内容