2014-07-02 4 views
6

का उपयोग करके कैसे पास करूं, मैं जेएस से सी ++ कक्षा/विधि से जावास्क्रिप्ट ऑब्जेक्ट को वापस भेजना चाहता हूं।मैं जावास्क्रिप्ट से C++ से वस्तुओं को 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 
} 

मैं निम्नलिखित का उपयोग खिड़कियों पर emscripten का उपयोग कर संकलित करने के लिए:

cmd> EMCC Access_Objects.cpp

मैं मैं निम्नलिखित सरल कोड का टुकड़ा है जो काम नहीं कर रहा है त्रुटियों का विशाल लॉग प्राप्त करें:

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 

था ई 'वायर.h' में त्रुटि उत्पन्न हो रही है जिसे 'emscripten/val.h' में शामिल किया गया है।

मैं इन त्रुटियों को कैसे हल करूं? या क्या जेएस से सी ++ तक ऑब्जेक्ट पास करने का कोई अन्य तरीका है?

+0

एक और तरीका है के रूप में संकलक करने के लिए = C++ 11 -std पास करनी होगी ऑब्जेक्ट पास करने के लिए: http://leaningtech.com/cheerp/ – ArtemGr

+0

यह सी ++ 11 फीचर्स का उपयोग कर रहा है, इसलिए सही कमांड 'em ++ -std = C++ 11 Access_Objects.cpp' होगा –

उत्तर

3

जेएस और सी ++ के बीच बातचीत करने के अन्य तरीके हैं। मैंने पाया है कि सबसे स्थिर तरीका जेएस कार्यों को लपेटकर अपनी खुद की लाइब्रेरी बनाना है ताकि आप उन्हें C++ से कॉल कर सकें।

यदि आप सी ++ से जावास्क्रिप्ट के Math.abs() को कॉल करना चाहते हैं, तो आप "src/library.JS" संपादित कर सकते हैं। वहां आपको फ़ंक्शन नामों का एक विशाल मानचित्र मिलेगा जो सी ++ में उपलब्ध हैं। आप अपने नए समारोह "JS_Math_abs" कॉल करना चाहता था, तो आप जोड़ना होगा:

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

तो फिर तुम इनपुट और आउटपुट प्रकार निर्दिष्ट करने के लिए अपने सी ++ कोड को संशोधित करेगा। जोड़ें:

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

मुझे गलत मत करो, इस विधि वैल किया जाना चाहिए (यह ठीक से काम कर रहे थे) की तुलना में अधिक कष्टप्रद है, लेकिन यह भी अंत में और अधिक कुशल होना चाहिए। एक बार आपके पास मुख्य पुस्तकालयों को लपेटने के बाद, आपको यह बहुत स्थिर लगेगा। अधिकांश भाग के लिए, हालांकि, abs() जैसे कार्यों के C++ संस्करणों का उपयोग करना आसान है।

आप यहाँ अपने स्वयं के पुस्तकालयों बनाने के बारे में और अधिक जानकारी प्राप्त कर सकते हैं: http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#interacting-with-code-call-javascript-from-native

0

उल्लेख किया है इसके बाद के संस्करण आप अपने का उपयोग कर C++ 11

संबंधित मुद्दे