簡體   English   中英

如何使用Emscripten將對象從Javascript傳遞到C ++

[英]How do I pass objects from Javascript to C++ using Emscripten

我想將一個Javascript對象從JS傳遞回C ++類/方法。 我有以下簡單的代碼片段,它不起作用:

// 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
}

我使用以下代碼在Windows上使用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

錯誤是在'wire.h'中引起的,它包含在'emscripten / val.h'中。

我該如何解決這些錯誤? 或者有沒有其他方法將對象從JS傳遞給C ++?

還有其他方法可以在JS和C ++之間進行交互。 我發現最穩定的方法是通過包裝JS函數來構建自己的庫,以便可以從C ++中調用它們。

如果你想從C ++調用Javascript的Math.abs(),你可以編輯“src / library.JS”。 在那里,您將找到一個C ++中可用的函數名稱的巨型映射。 如果你想調用你的新函數“JS_Math_abs”,你會添加:

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

然后,您將修改C ++代碼以指定輸入和輸出類型。 加:

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

不要誤解我的意思,這種方法比val應該更煩人(它是否正常工作),但它最終也應該更有效率。 一旦你有了需要包裝的主庫,你會發現它非常穩定。 但是,在大多數情況下,使用像abs()這樣的函數的C ++版本很容易。

您可以在此處找到有關創建自己的庫的更多信息: http//kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#interacting-with-code-call-javascript-從本機

如上所述,您需要將-std = c ++ 11作為其使用c ++ 11傳遞給編譯器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM