2013-09-05 29 views
5

我試圖將一個外部C++庫(我有權訪問.so文件以及頭文件)集成到我的Node.js應用程序中。從Node.js(Node addons/node-ffi)調用C++庫

了大量的研究後,我的選擇是減少到:

  1. Node addon

  2. 使用node-ffi

從節點FFI的GitHub的定義,我不能告訴如果它會或不會直接在C++庫上工作:

node-ffi是一個用於使用純JavaScript加載和調用動態庫的Node.js插件。它可以用來在不編寫任何C++代碼的情況下創建與本地庫的綁定。

所以我的問題是:

  • 是否選擇1)意味着在某種程度上改寫外部C++庫?
  • node-ffi是否能夠直接調用C++庫,而不需要任何C封裝器?我必須寫入?

我不是專家,當涉及到C/C++,所以如果我錯過了一些基本的東西讓你能夠回答,請讓我知道,我可以提高我的問題。

+0

還有一個類似的問題:http://stackoverflow.com/questions/16783023/node-ffi-vs-node-extension-for-accessing-existing-c-functionality?rq=1但我認爲它沒有完全回答我的問題。 –

回答

4

node-ffi似乎主要針對C程序。我在上個星期經歷了這個,並發現使用節點插件的運氣好得多。你需要做的是在庫中的C++代碼和node.js之間寫一個墊片。在我的情況下,我需要對安全協議的數據包進行編碼和解碼,因此我製作了包含數據包的節點緩衝區,並編寫了從緩衝區中獲取數據的C++代碼,然後將數據發送到我編碼的C代碼解碼的分組。

本頁面:http://luismreis.github.io/node-bindings-guide/docs/returning.html有一些很好的例子,說明如何從C++中的node.js緩衝區獲取數據。

+1

ffi與C++一起工作,只需使用extern「C」來定義你的lib的接口(就像用C編寫的任何東西一樣,也可以由C使用),請參閱http://stackoverflow.com/questions/16783023/node-ffi -vs-node-extension-for-access-existing-c-functional?rq = 1瞭解詳情。 – konsumer

2

其他答案缺少的是什麼?我很樂意提供幫助。代碼示例用C++編寫。我正在說明人們(如何使C或C++庫)定義一個外部接口供其他人使用。 ffi的一點是,你使用你使用的任何語言(在這裏是javascript)而不是C/C++(如節點擴展的情況下)編寫包裝。如果你的原始庫是一個用於其他事物的共享DLL,它已經有了一個接口,你只需要在javascript中編寫包裝代碼來告訴節點它是如何工作的,而不是用C++編寫某些東西,並將其暴露在本地nodejs庫中。

+0

你可以在這裏找到信息https://github.com/rbranson/node-ffi/wiki/Node-FFI-Tutorial這是一個包裝sqlite的幾個方法的例子。 lib是C或C++的事實是無關緊要的,只是它定義了一個接口(就像所有的共享庫一樣)。 – konsumer

2

nbind現在可以更容易地使用外部C++庫編寫Node.js插件。您基本上創建了一個新的源文件,包括庫標題,nbind標題和一些列出庫的類和方法的宏調用。然後nbind處理剩下的事情。

libui-node是一個使用nbind調用libui的真實世界示例,用於使用Node.js的本機窗口小部件生成用戶界面。還有一個short tutorial如何爲vg創建一個生物信息學相關的C++庫的綁定。

0

有很簡單的方法來鏈接你的任何圖書館(.so .dll .a)。你應該在binging.gyp文件與正確的路徑添加庫:

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

也有使用nan寫出好的插件更簡單的方法。檢查鏈接的更多信息github link