2014-07-02 10 views
6

Chcę przekazać obiekt JavaScript z klasy/metody JS do C++. Mam następujący fragment kodu proste, które nie działa:Jak przekazywać obiekty z JavaScript do C++ przy użyciu Emscripten

// Access JS objects in C++ like C++ objects 

#include "emscripten/val.h" //Causing errors ! 

using namespace emscripten; 
int main() { 
    val Math = val::global("Math"); 
    return Math.call("abs", -10); // returns 10 
} 

używam następujące skompilować za pomocą emscripten na oknach:

cmd> EMCC Access_Objects.cpp

I uzyskać ogromny dziennik błędów:

In file included from Access_Objects.cpp:2: 
In file included from C:\Program Files\Emscripten\emscripten\1.16.0\system\inclu 
de\emscripten/val.h:4: 
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:2 
4:5: error: 
     unknown type name 'constexpr' 
    constexpr bool has_unbound_type_names = true; 
    ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:2 
4:15: error: 
     expected unqualified-id 
    constexpr bool has_unbound_type_names = true; 
      ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:5 
6:21: error: 
     use of undeclared identifier 'has_unbound_type_names' 
       if (has_unbound_type_names || std::is_polymorphic<C>::value) { 
        ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:6 
7:17: error: 
     use of undeclared identifier 'has_unbound_type_names' 
      if (has_unbound_type_names || std::is_polymorphic<C>::value) { 
       ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:8 
2:40: error: 
     a space is required between consecutive right angle brackets (use '> >') 
     struct TypeID<std::unique_ptr<T>> { 
            ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:9 
8:42: error: 
     a space is required between consecutive right angle brackets (use '> >') 
     struct TypeID<AllowedRawPointer<T>> { 
             ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
82:9: error: 
     unknown type name 'constexpr' 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(char); 
     ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:13: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
82:9: error: 
     expected member name or ';' after declaration specifiers 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(char); 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:23: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ~~~~~~~~~^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
83:9: error: 
     unknown type name 'constexpr' 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(signed char); 
     ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:13: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
83:9: error: 
     expected member name or ';' after declaration specifiers 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(signed char); 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:23: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ~~~~~~~~~^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
84:9: error: 
     unknown type name 'constexpr' 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(unsigned char); 
     ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:13: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
84:9: error: 
     expected member name or ';' after declaration specifiers 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(unsigned char); 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:23: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ~~~~~~~~~^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
85:9: error: 
     unknown type name 'constexpr' 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(signed short); 
     ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:13: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
85:9: error: 
     expected member name or ';' after declaration specifiers 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(signed short); 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:23: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ~~~~~~~~~^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
86:9: error: 
     unknown type name 'constexpr' 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(unsigned short); 
     ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:13: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
86:9: error: 
     expected member name or ';' after declaration specifiers 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(unsigned short); 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:23: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ~~~~~~~~~^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
87:9: error: 
     unknown type name 'constexpr' 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(signed int); 
     ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:13: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
87:9: error: 
     expected member name or ';' after declaration specifiers 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(signed int); 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:23: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ~~~~~~~~~^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
88:9: error: 
     unknown type name 'constexpr' 
     EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE(unsigned int); 
     ^
C:\Program Files\Emscripten\emscripten\1.16.0\system\include\emscripten/wire.h:1 
74:13: note: 
     expanded from macro 'EMSCRIPTEN_DEFINE_NATIVE_BINDING_TYPE' 
      constexpr static WireType toWireType(const type& v) { \ 
      ^
fatal error: too many errors emitted, stopping now [-ferror-limit=] 
20 errors generated. 
ERROR root: compiler frontend failed to generate LLVM bitcode, halting 

Th Błąd e jest spowodowany w 'wire.h', który jest zawarty w 'emscripten/val.h'.

Jak rozwiązać te błędy? Lub Czy istnieje inny sposób przekazywania obiektów z JS do C++?

+0

Innym sposobem przekazywać obiekty: http://leaningtech.com/cheerp/ – ArtemGr

+0

Używa funkcji C++ 11, więc poprawne polecenie to 'em ++ -std = C++ 11 Access_Objects.cpp' –

Odpowiedz

3

Istnieją inne sposoby interakcji między JS i C++. Najbardziej stabilnym sposobem, jaki znalazłem, jest zbudowanie własnej biblioteki poprzez zawijanie funkcji JS, aby można było wywoływać je z C++.

Jeśli chcesz wywołać Math.abs() Javascript z C++, możesz edytować "src/library.JS". Tam znajdziesz gigantyczną mapę nazw funkcji dostępnych w C++. Jeśli chcesz połączyć się nowa funkcja „JS_Math_abs”, należy dodać:

JS_Math_abs: function(value) { 
    return Math.abs(value); 
}, 

Następnie należy zmodyfikować kod C++, aby określić typy wejściowych i wyjściowych. Dodaj:

extern "C" { 
    extern int JS_Math_abs(int); 
} 

Nie zrozumcie mnie źle, ta metoda jest bardziej irytujące niż val należy (były to działa prawidłowo), ale powinien być także bardziej efektywne w końcu. Gdy masz już główne biblioteki, które chcesz zapakować, okaże się, że są bardzo stabilne. Jednak w większości przypadków jest to łatwe w użyciu w wersjach C++ takich jak abs().

Możesz dowiedzieć się więcej na temat tworzenia własnych bibliotek tutaj: http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#interacting-with-code-call-javascript-from-native

0

Jak wspomniano powyżej, trzeba zdać -std = C++ 11 do kompilatora jak jego użyciu C++ 11

Powiązane problemy