Ссылка двоичного компонента на js-ctypes - PullRequest
4 голосов
/ 30 мая 2011

Я зарегистрировал двоичный компонент в моем chrome.manifest:

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

Теперь я хочу передать его путь к ctypes.open(). Мой вопрос: как я могу ссылаться на двоичный компонент, чтобы я мог передать его на ctypes.open()?

Ответы [ 2 ]

6 голосов
/ 07 июня 2011

Бинарные компоненты, перечисленные в chrome.manifest, должны быть компонентами XPCOM. С другой стороны, у вас обычная библиотека, нет необходимости перечислять ее в манифесте - вместо этого это очень «ручной» подход. Ваш код должен проверить nsIXULRuntime.XPCOMABI (см. https://developer.mozilla.org/En/NsIXULRuntime), чтобы узнать, совместима ли платформа. Затем вам нужно узнать местоположение вашего библиотечного файла, примерно так:

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

Первый параметр getAddonByID () должен быть заменен идентификатором вашей надстройки. И здесь предполагается, что ваше дополнение установлено распакованным (<em:unpack>true</em:unpack> указано в install.rdf), потому что в противном случае на диске не будет файла для загрузки.

5 голосов
/ 28 июля 2011

Вы можете использовать «ресурс» для ссылки на обычный двоичный файл в вашем дополнении: добавьте это в свой манифест:

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" даст вам правильный путь к lib на другой платформе.

В вашем файле javascript вы можете ссылаться на путь к библиотеке следующим образом:

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);
    /// ...
}
...