2017-09-20 4 views
6

J'essaie un exemple simple pour appeler une fonction C compilée en .wasm avec JavaScript."Échec de l'assertion: vous devez attendre que l'exécution soit prête" Erreur lors de l'appel d'une fonction C en JavaScript

Ce fichier est le counter.c:

#include <emscripten.h> 

int counter = 100; 

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

Je l'ai compilé en utilisant emcc counter.c -s WASM=1 -o counter.js.

Mon main.js fichier JavaScript:

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

Mes fichiers index.html charge uniquement les fichiers .js dans le corps, rien d'autre:

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

L'erreur que je reçois est:

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

lorsque je y appeler count() en main.js. Comment puis-je attendre que l'exécution soit prête?

Répondre

5

J'ai trouvé une solution rapide. Je devais modifier main.js à:

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

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

Cela modifie l'objet Module qui est défini dans le script généré par counter.js emscripten.

0

Les autres œuvres de réponse, comme indiqué here sous la « Comment puis-je savoir quand la page est complètement chargée et il est sûr d'appeler des fonctions compilées? » en-tête, où l'article mentionne aussi une autre façon d'attendre d'appeler code où vous incluez une fonction principale dans votre code C/C++ qui appelle une fonction javascript par le C/C++ API Javascript comme ceci:

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

Cela fonctionne parce que la fonction principale exécute toujours lorsque l'exécution est initialisé.