2017-09-20 25 views
6

Próbuję prosty przykład wywołania funkcji C skompilowanej do .wasm z JavaScriptem."Asercja nie powiodła się: musisz poczekać, aż środowisko uruchomieniowe będzie gotowe" Błąd podczas wywoływania funkcji C w JavaScript

Jest to plik counter.c:

#include <emscripten.h> 

int counter = 100; 

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

Skompilowałem go za pomocą emcc counter.c -s WASM=1 -o counter.js.

My main.js JavaScript plik:

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

My tylko index.html plików ładunki zarówno plikach .js w organizmie, nic innego:

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

Błąd Dostaję jest:

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

kiedy tr y zadzwonić pod numer count() w main.js. Jak mogę poczekać, aż środowisko uruchomieniowe będzie gotowe?

Odpowiedz

5

Znalazłem szybkie rozwiązanie. Musiałem zmodyfikować main.js do:

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

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

Zmienia to obiekt Module, który jest zdefiniowany w skrypcie counter.js generowanego przez emscripten.

0

pozostałych robót odpowiedź, jak określono here pod „Jak mogę powiedzieć, gdy strona jest w pełni załadowany i jest to bezpieczne, aby zadzwonić skompilowanych funkcji?” nagłówka, gdzie artykuł wspomina również inny sposób, aby czekać, aby zadzwonić Kod, w którym to główną funkcję w swojej C/C kod ++, który wywołuje funkcję javascript przez C/C++ do javaScript API tak:

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

To działa, ponieważ główną funkcją zawsze wykonywane, gdy czas pracy jest inicjowany.