将二进制组件引用到js-ctypes

use*_*121 4 javascript packaging firefox-addon jsctypes

我已经注册了一个二进制组件chrome.manifest:

binary-component components/linux/myLib.so abi=Linux_x86-gcc3
Run Code Online (Sandbox Code Playgroud)

现在我想通过它的路径ctypes.open().我的问题是:我如何引用二进制组件,以便将其传递给ctypes.open()

Wla*_*ant 6

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);
        ...
    }
});
Run Code Online (Sandbox Code Playgroud)

getAddonByID()的第一个参数当然需要替换为加载项的ID.这里的假设是你的加载项是解压缩安装的(<em:unpack>true</em:unpack>在install.rdf中指定),因为否则磁盘上没有要加载的文件.


小智 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
Run Code Online (Sandbox Code Playgroud)

"ABI"指令将在不同平台下提供正确的lib路径.

在您的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);
    /// ...
}
Run Code Online (Sandbox Code Playgroud)