“断言失败:您需要等待运行时准备好”在JavaScript中调用C函数时出错

时间:2017-09-20 21:40:20

标签: javascript emscripten webassembly

我正在尝试一个简单的例子,用JavaScript调用编译为.wasm的C函数。

这是counter.c文件:

#include <emscripten.h>

int counter = 100;

EMSCRIPTEN_KEEPALIVE
int count() {  
    counter += 1;
    return counter;
}

我使用emcc counter.c -s WASM=1 -o counter.js编译了它。

我的main.js JavaScript文件:

const count = Module.cwrap('count ', 'number');
console.log(count());

我的index.html文件只加载正文中的两个.js文件,没有别的:

<script type="text/javascript" src="counter.js"></script>
<script type="text/javascript" src="main.js"></script>

我得到的错误是:

Uncaught abort("Assertion failed: you need to wait for the runtime to be ready (e.g. wait for main() to be called)") at Error

当我尝试在count()中拨打main.js时。 如何等待运行时准备好?

2 个答案:

答案 0 :(得分:10)

我找到了一个快速解决方案。我需要将main.js修改为:

Module['onRuntimeInitialized'] = onRuntimeInitialized;
const count = Module.cwrap('count ', 'number');

function onRuntimeInitialized() {
    console.log(count());
}

这会改变emscripten生成的Module脚本中定义的counter.js对象。

答案 1 :(得分:2)

另一个答案有效,按照“{strong>如何判断页面何时完全加载并且可以安全地调用已编译的函数?”标题下的here,其中文章还提到了另一种等待调用代码的方法,其中在C / C ++代码中包含一个main函数,该代码通过C / C ++调用javascript函数,如下所示:

#include <emscripten.h>
int main() {
    EM_ASM(const count = Module.cwrap('count ', 'number'); console.log(count()););
    return 0;
}

这是有效的,因为main函数总是在初始化运行时执行。