Ссылка бинарного компонента на js-ctypes

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

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

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


person user176121    schedule 30.05.2011    source источник


Ответы (2)


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

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() необходимо заменить на идентификатор вашего дополнения. И здесь предполагается, что ваш аддон установлен в распакованном виде (<em:unpack>true</em:unpack> указано в install.rdf), потому что иначе на диске не будет загружаемого файла.

person Wladimir Palant    schedule 06.06.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» даст правильный путь к библиотеке на другой платформе.

В вашем файле 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);
    /// ...
}
person ZHUO Qiang    schedule 28.07.2011