Ссылка двоичного компонента на js-ctypes

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

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

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

2 ответа

Решение

Двоичные компоненты, перечисленные в 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), поскольку в противном случае на диске не будет файла для загрузки.

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

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);
    /// ...
}
Другие вопросы по тегам