2017-09-20 127 views
6

我正在嘗試一個簡單的示例來調用C編譯爲JavaScript的.wasm函數。「聲明失敗:您需要等待運行時準備就緒」在JavaScript中調用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

當我tr y致電count(),電話號碼main.js如何等待運行時準備就緒?

回答

5

我找到了一個快速解決方案。我需要修改main.js到:

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

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

這改變了在由emscripten產生的counter.js腳本中定義的Module對象。

0

對方回答的作品,按照規定根據「我怎麼知道當頁面完全加載,它是安全地調用編譯的功能呢?」頭,這裏的文章還提到了另一種方式來等待調用here代碼,你包括你的C主函數/ C++代碼,通過C/C++爲Javascript API,像這樣調用javascript函數:

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

這工作,因爲當運行時初始化的主要功能始終執行。

相關問題