Ссылка двоичного компонента на 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);
/// ...
}