如何正确设置Webassembly表的大小?

时间:2019-03-09 19:17:59

标签: emscripten webassembly

我试图使用microjson库解析C中的json字符串,然后使用emscripten将其编译为wasm。我使用给定in this link的microjson示例2,仅添加了标头 emscripten.h 我遇到了错误:

  

LinkError:导入的内存大小不兼容

     

LinkError:导入的表的大小不兼容

我通过在导入对象中使用各种初始值和最大大小的内存来克服这些错误。我将内存初始设置为256,最大设置为256,表初始设置为10,最大设置为10。更改任何数字(即,将表最大更改为11)都会导致上面的第二个错误。

wat格式有24个功能,而不是10个。这些数字的神奇之处是什么。这是我的JavaScript代码:

`<script>
    var memory = new WebAssembly.Memory({ initial: 256, maximum: 256});
    let exports = null;
    const importObject = {
        env: {
            table: new WebAssembly.Table({ initial: 10, maximum:10, element: 'anyfunc' }),
            __table_base: 0,
            memory: memory,
            __memory_base: 0,
            DYNAMICTOP_PTR: 0,
            tempDoublePtr: 0,
            abortStackOverflow: () => { throw new Error('overflow'); },
            abort: function () { },
            _abort: function(){},
            _getenv: function(){},
            enlargeMemory: function () { },
            getTotalMemory: function () { },
            abortOnCannotGrowMemory: function () { },
            nullFunc_ii: function () { },
            nullFunc_iii: function () { },
            nullFunc_iiii: function () { },
            ___lock: function () { },
            ___setErrNo: function () { },
            ___syscall140: function () { },
            ___syscall146: function () { },
            ___syscall54: function () { },
            ___syscall6: function () { },
            ___unlock: function () { },
            _emscripten_memcpy_big: function () { },
            _emscripten_get_heap_size: function(){},
            _emscripten_resize_heap: function(){},
            STACKTOP: 0,
            STACK_MAX: memory.buffer.byteLength
        },
        global: {
            NaN: NaN,
            Infinity: Infinity
        }
    };
    var res;
    async function init() {
        const wa = await createWebAssembly('json_parser.wasm', importObject);
        let exports = wa.instance.exports;
        res = exports._parse_json();
        console.log(res);
    }
    init();

    async function createWebAssembly(path, importObject) {
        const result = await window.fetch(path);
        const bytes = await result.arrayBuffer();
        return WebAssembly.instantiate(bytes, importObject);
    }
</script>`

这是我的C代码

`#include <emscripten.h>   
 #include "mjson.h"

 #define MAXCHANNELS 72

 static bool usedflags[MAXCHANNELS];
 static int PRN[MAXCHANNELS];
 static int elevation[MAXCHANNELS];
 static int azimuth[MAXCHANNELS]; 
 static int visible;

const struct json_attr_t sat_attrs[] = {
{"PRN",     t_integer, .addr.integer = PRN},
{"el",      t_integer, .addr.integer = elevation},
{"az",      t_integer, .addr.integer = azimuth},
{"used",    t_boolean, .addr.boolean = usedflags},
{NULL},
};

const struct json_attr_t json_attrs_sky[] = {
{"class",      t_check,   .dflt.check = "SKY"},
{"satellites", t_array,   .addr.array.element_type = t_object,
                          .addr.array.arr.objects.subtype=sat_attrs,
                          .addr.array.maxlen = MAXCHANNELS,
                          .addr.array.count = &visible},
{NULL},
};

EMSCRIPTEN_KEEPALIVE int parse_json()
{
int i, status = 0;
char js_str[] = "{\"class\":\"SKY\",\"satellites\":"
          "[{\"PRN\":10,\"el\":45,\"az\":196,\"used\":true},"
           "{\"PRN\":29,\"el\":67,\"az\":310,\"used\":true}]}";
status = json_read_object(js_str, json_attrs_sky, NULL);
return PRN[1];
}`

我如何编译C代码

  

emcc -s WASM = 1 json_parser.c mjson.c -o json_parser.js

该库不足以满足我的目的,因此我切换到nloahmann/json C ++库。一切正常,但再次出现第二个错误。我的邀请是这样的:这个数字代表什么?我该如何正确设置?
我的Firefox版本是65.0.1 64位,脚本版本是1.38.28

0 个答案:

没有答案