"Assertion failed: you need to wait for the runtime to be ready" 在 JavaScript 中调用 C 函数时出错
"Assertion failed: you need to wait for the runtime to be ready" Error when calling a C function in JavaScript
我正在尝试一个简单的示例来调用编译为 .wasm 的 C 函数 JavaScript。
这是 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
当我尝试在 main.js
中调用 count()
时。 如何等待运行时就绪?
我找到了一个快速的解决方案。我需要将 main.js
修改为:
Module['onRuntimeInitialized'] = onRuntimeInitialized;
const count = Module.cwrap('count ', 'number');
function onRuntimeInitialized() {
console.log(count());
}
这会改变由 emscripten 生成的 counter.js
脚本中定义的 Module
对象。
其他答案有效,如“我如何判断页面何时完全加载以及调用编译函数是否安全?”下指定的here header,文章还提到了另一种等待调用代码的方法,其中您在 C/C++ 代码中包含一个 main 函数,该函数通过 C/C 调用 javascript 函数++ 到 Javascript API 像这样:
#include <emscripten.h>
int main() {
EM_ASM(const count = Module.cwrap('count ', 'number'); console.log(count()););
return 0;
}
这是可行的,因为 main 函数总是在运行时初始化时执行。
我正在尝试一个简单的示例来调用编译为 .wasm 的 C 函数 JavaScript。
这是 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
当我尝试在 main.js
中调用 count()
时。 如何等待运行时就绪?
我找到了一个快速的解决方案。我需要将 main.js
修改为:
Module['onRuntimeInitialized'] = onRuntimeInitialized;
const count = Module.cwrap('count ', 'number');
function onRuntimeInitialized() {
console.log(count());
}
这会改变由 emscripten 生成的 counter.js
脚本中定义的 Module
对象。
其他答案有效,如“我如何判断页面何时完全加载以及调用编译函数是否安全?”下指定的here header,文章还提到了另一种等待调用代码的方法,其中您在 C/C++ 代码中包含一个 main 函数,该函数通过 C/C 调用 javascript 函数++ 到 Javascript API 像这样:
#include <emscripten.h>
int main() {
EM_ASM(const count = Module.cwrap('count ', 'number'); console.log(count()););
return 0;
}
这是可行的,因为 main 函数总是在运行时初始化时执行。