2013-09-05 23 views
5

Próbuję zintegrować zewnętrzną bibliotekę C++ (mam dostęp do pliku .so, a także pliki nagłówkowe) do mojej aplikacji Node.js .Zadzwoń do biblioteki C++ z Node.js (Węzeł addons/node-ffi)

Po wielu badaniach moje możliwości są ograniczone do:

  1. Pisanie Node addon

  2. Korzystając node-ffi

Z definicji Node-FFI na GitHub za nie mogę powiedzieć jeśli będzie lub nie będzie działać bezpośrednio w bibliotekach C++:

node-ffi to dodatek Node.js do ładowania i wywoływania bibliotek dynamicznych za pomocą czystego JavaScript. Może być używany do tworzenia powiązań z bibliotekami natywnymi bez pisania jakiegokolwiek kodu C++.

Więc mam pytania są następujące:

  • Czy opcja 1) wynika, przepisywanie w jakiś sposób C++ zewnętrznej biblioteki?
  • Czy można połączyć się bezpośrednio z bibliotekami C++ bez żadnego opakowania C, które bym musiał napisać?

Nie jestem ekspertem, jeśli chodzi o C/C++, więc jeśli przegapiłem coś podstawowego, aby móc odpowiedzieć, proszę dać mi znać, abym mógł poprawić moje pytanie.

+0

Istnieje podobne pytanie: http://stackoverflow.com/questions/16783023/node-ffi-vs-node-extension-for-accessing-isting-c-functionality?rq=1 ale myślę, że nie w pełni odpowiada na moje pytania. –

Odpowiedz

4

node-ffi wydaje się być głównie dla programów w języku C. Przeszedłem przez to w zeszłym tygodniu i znalazłem dużo lepsze szczęście z dodatkami węzłów. Co musisz zrobić, to napisać podkładkę między kodem C++ w bibliotece a node.js. W moim przypadku potrzebowałem kodować i dekodować pakiety dla protokołu bezpieczeństwa, więc zrobiłem bufory węzłów, które zawierały pakiety, i napisałem kod C++, który dostarczył dane z buforów, następnie wysłałem dane do mojego kodu C, który zakodował i dekodowane pakiety.

Ta strona: http://luismreis.github.io/node-bindings-guide/docs/returning.html ma kilka świetnych przykładów, jak uzyskać dane zi do buforów node.js w C++.

+1

ffi działa z C++, wystarczy użyć zewnętrznego "C", aby zdefiniować interfejs biblioteki (tak jak w przypadku wszystkich napisów w C++, które mogą być również wykorzystywane przez C), patrz http://stackoverflow.com/questions/16783023/node-ffi -vs-node-extension-for-accessing-istniejąca-c-funkcjonalność? rq = 1 po szczegóły. – konsumer

2

Czego brakuje w drugiej odpowiedzi? Jestem szczęśliwy, że pomagam. Przykład kodu jest napisany w C++. Pokazuję, w jaki sposób ludzie (tworzący biblioteki w C lub C++) definiują zewnętrzny interfejs, z którego mogą korzystać inni. Celem ffi jest zapisywanie swojego wrappera w dowolnym języku, którego używasz (w tym przypadku javascript) zamiast C/C++ (jak w przypadku rozszerzeń węzłów). Jeśli twoja oryginalna biblioteka jest wspólną biblioteką DLL używaną w innych rzeczach, ma już interfejs, wystarczy napisać kod wrappera w javascriptu, aby powiedzieć węzłowi, jak działa, zamiast pisać coś w C++ i odsłonić go w natywnej bibliotece nodejs.

+0

Możesz znaleźć informacje tutaj https://github.com/rbranson/node-ffi/wiki/Node-FFI-Tutorial, który jest przykładem owijania kilku metod sqlite. Fakt, że lib jest C lub C++ jest nieistotny, tylko dlatego, że definiuje interfejs (tak jak robią to wszystkie udostępniane biblioteki). – konsumer

2

nbind teraz ułatwia pisanie dodatków Node.js przy użyciu zewnętrznych bibliotek C++. Zasadniczo tworzysz nowy plik źródłowy zawierający nagłówki bibliotek, nagłówki nbind i niektóre wywołania makr z listą klas i metod biblioteki. Następnie nbind zajmuje się resztą.

libui-node to przykład w realnym świecie używający nbind do wywoływania libui do generowania interfejsów użytkownika z natywnymi widżetami z Node.js. Istnieje również short tutorial, jak utworzyć wiązania dla biblioteki C++ związanej z bioinformatyką.

0

Istnieje bardzo prosty sposób na połączenie dowolnej biblioteki (.so .dll .a). Należy dodać bibliotekę z właściwej ścieżki w binging.gyp pliku:

{ 
    "targets": [ 
    { 
     "target_name": "addon", 
     "sources": [ "hello.cc" ], 
     "libraries": [ 
      "path/toYourLibrary/yourLibName.dll or yourLibName.so" 
      ] 
    } 
    ] 
} 

Ponadto istnieje bardziej prostszy sposób pisać dobre dodatki używając nan. Sprawdź link, aby uzyskać więcej informacji. github link