2015-11-12 6 views
0

Пусть у меня есть функция x в C++ определяется как:Где я должен определять внешние функции emscripten в JS?

extern "C" void x(); 

и я реализую его в JS в глобальном контексте

function _x() { console.log('x called'); } 

_x определяется в ASM Составитель расслоение плотной файл, который становится испробованы и не моя реализация. Что я делаю не так?

Я получаю это предупреждение, пока связь:

warning: unresolved symbol: x 

Вот StackTrace:

Uncaught abort() at Error 
at jsStackTrace (http://localhost/module.js:978:13) 
at stackTrace (http://localhost/module.js:995:22) 
at abort (http://localhost/module.js:71106:25) 
at _x (http://localhost/module.js:5829:46) 
at Array._x__wrapper (http://localhost/module.js:68595:41) 
at Object.dynCall_vi (http://localhost/module.js:68442:36) 
at invoke_vi (http://localhost/module.js:7017:25) 
at _LoadFile (http://localhost/module.js:7573:6) 
at asm._LoadFile (http://localhost/module.js:69219:25) 
at eval (eval at cwrap (http://localhost/module.js:554:17), <anonymous>:6:26) 
+0

Можете ли вы уточнить, какова ваша цель/прецедент? –

+0

Связь между emscripten скомпилированной JS для нормальной JS (http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#implement-ac-api-in-javascript) –

+0

Передача строка между emscripten, скомпилированным JS, в обычный JS (http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#implement-ac-api-in-javascript) –

ответ

0

Если вы хотите передать строку из C++ в Javascript, вы не должны пройдите по маршруту Implement a C API in Javascript. Вместо этого вы можете использовать EM_ASM* macros для непосредственного встраивания Javascript. Затем это может вызвать функции Javascript, которые вы определили, и передать их значения.

Кроме того, чтобы передать строку, вы должны убедиться, что вы передаете строку в стиле С, а затем использовать Emscripten поставляемой Pointer_stringify функции Javascript на результате:

#include <string> 

#include <emscripten.h> 

int main() 
{ 
    std::string myString("This is a string in C++"); 

    EM_ASM_ARGS({ 
    console.log(Pointer_stringify($0)); 
    }, myString.c_str()); 

    return 0; 
} 
+0

Является ли это можно сделать с помощью «Внедрить C API в Javascript»? потому что это более читаемо. –

1

Как описано в Implement a C API in Javascript, вы определяете библиотеку, имея файл Javascript, который вызывает mergeInto, чтобы объединить объект со своими функциями Javascript в LibraryManager.library. Затем вы компилируете с опцией --js-library для передачи в месте расположения вашей библиотеки.

Например, вы можете иметь Javascript файл с библиотекой одной функции

// In library.js 
mergeInto(LibraryManager.library, { 
    x: function() { 
    alert('hi'); 
    }, 
}); 

основной C файл ++, который вызывает эту функцию

// in librarytest.cc 
extern "C" void x(); 

int main() 
{ 
    x(); 
    return 0; 
} 

и компилировать в HTML и Javascript с

em++ librarytest.cc --js-library library.js -o librarytest.html 

затем вы загружаете librarytest.html в браузер, это будет показано бокс с hi.

Смежные вопросы