2011-05-30 46 views
4

我在chrome.manifest註冊的二進制組件:參考二進制組件JS-ctypes的

binary-component components/linux/myLib.so abi=Linux_x86-gcc3 

現在,我想它的路徑傳遞給ctypes.open()。我的問題是:如何引用二進制組件,以便我可以將它傳遞給ctypes.open()

回答

6

chrome.manifest中列出的二進制組件應該是XPCOM組件。另一方面,你是一個普通的圖書館,不需要在清單中列出它 - 而是一種非常「手動」的方法。您的代碼需要檢查nsIXULRuntime.XPCOMABI(請參閱https://developer.mozilla.org/En/NsIXULRuntime)以查看平臺是否兼容。然後,你需要讓你的庫文件的位置,這樣的事情:需要由您的附加課程的ID被替換

Components.utils.import("resource://gre/modules/AddonManager.jsm"); 
AddonManager.getAddonByID("[email protected]", function(addon) 
{ 
    var uri = addon.getResourceURI("components/linux/myLib.so"); 
    if (uri instanceof Components.interfaces.nsIFileURL) 
    { 
     ctypes.open(uri.file.path); 
     ... 
    } 
}); 

的第一個參數getAddonByID()。此處的假設是,您的加載項已解壓縮安裝(在install.rdf中指定的<em:unpack>true</em:unpack>),否則將無法加載磁盤上的文件。

5

你可以使用「資源」來引用正常的二進制文件在你的插件: 添加到您的清單:

resource YOUR-ADDON-LIB path/to/libaddon.so ABI=Linux_x86-gcc3 
resource YOUR-ADDON-LIB path/to/addon.dll ABI=WINNT_x86-msvc 

的「ABI」指令會給出不同的平臺下,你的右手庫路徑。

在你的JavaScript文件,您可以參考這樣的lib路徑:

const ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); 
var uri = ioService.newURI('resource://YOUR-ADDON-LIB', null, null); 
if (uri instanceof Components.interfaces.nsIFileURL) 
{ 
    var lib = ctypes.open(uri.file.path); 
    /// ... 
}