未捕获的类型错误:Module.cwrap 不是一个函数。

3

我需要在浏览器端解码h264数据,为此我正在使用使用emscripten构建的WebAssembly中的openh264库。

我已经成功构建了它,并尝试在JavaScript中使用它来解码h264数据。 但是,在以下行中我遇到一个错误:

Original Answer

var open_decoder = Module.cwrap('open_decoder', 'number', null);

错误是:未捕获的类型错误:Module.cwrap不是一个函数。
如果有任何人用emscripten构建openh264,请帮助我解决这个问题。
我使用以下步骤来使用emscripten构建openh264。
  1. $ source emsdk_env.sh
  2. $./emsdk activate latest
  3. cd openh264-js-master
  4. make
注意:openh264的代码已从github(ttyridal)下载,并且已经具备emscripten能力的make文件。
2个回答

6
-s EXTRA_EXPORTED_RUNTIME_METHODS=["cwrap"]

在编译源代码时,请在命令行中包含上述内容。

emcc source.c -s EXPORTED_FUNCTIONS=['_my_add'] -s EXTRA_EXPORTED_RUNTIME_METHODS=["cwrap"]

3

你可能正在尝试在 Emscripten 运行时初始化之前使用 Module,因此Module.cwrap 未定义。

为确保运行时已准备就绪,请将代码放置在 Module.onRuntimeInitialized 中,例如以下示例:

<!doctype html>
<html>
<body>
    <script>
        var Module = {
          onRuntimeInitialized: function() {
            my_add = Module.cwrap('my_add', 'number', ['number', 'number'])
            alert('1 + 2 = ' + my_add(1, 2));
          },
        };
    </script>
    <script async type="text/javascript" src="index.js"></script>
</body>
</html>

可以在这个 GitHub 仓库中查看完整的示例。


1
我已经就这个问题进行了一些研究,我认为问题不在于 JavaScript 方面。我认为 emscripten 的 makefile 命令存在一些问题。makefile 命令类似于 "em++ -O1 $(TOTALMEMORY) -o $@ $^ -s EXPORTED_FUNCTIONS=$(h264symbols) -s -Iopenh264/codec/api/svc/ "。所以,在对此进行一些研究后,我发现您需要添加 "EXTRA_EXPORTED_RUNTIME_METHODS='["cwrap"]' option。我用此选项编辑了 cmd,现在报错 TypeError: Module.asm._open_decoder 未定义。 - Kuldeep More
从 emscripten 文档中得知:cwrap 并不会直接调用编译后的代码(只有调用它返回的包装器才会这样做)。这意味着在运行时完全初始化之前就可以安全地调用 cwrap(但是当然,像一般的编译代码一样,调用返回的包装函数必须等待运行时)。https://emscripten.org/docs/api_reference/preamble.js.html?highlight=cwrap#cwrap - Antonis Christofides

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接