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()?
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)
| 归档时间: |
|
| 查看次数: |
2064 次 |
| 最近记录: |