Reference a binary-component to js-ctypes

…衆ロ難τιáo~ 提交于 2019-12-28 18:37:07

问题


I have registered a binary component in my chrome.manifest:

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

Now I want to pass its path to ctypes.open(). My question is: how do I reference the binary component so I can pass it to ctypes.open()?


回答1:


The binary components listed in chrome.manifest should be XPCOM components. Yours on the other hand is a regular library, no need to list it in the manifest - it is a very "manual" approach instead. Your code needs to check nsIXULRuntime.XPCOMABI (see https://developer.mozilla.org/En/NsIXULRuntime) to see whether the platform is compatible. Then you need to get the location of your library file, something like this:

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);
        ...
    }
});

The first parameter to getAddonByID() needs to be replaced by the ID of your add-on of course. And the assumption here is that your add-on is installed unpacked (<em:unpack>true</em:unpack> specified in install.rdf) because otherwise there won't be a file on disk to be loaded.




回答2:


You could use "resource" to reference the normal binary file in your addon: add this to your manifest:

resource YOUR-ADDON-LIB path/to/libaddon.so ABI=Linux_x86-gcc3
resource YOUR-ADDON-LIB path/to/addon.dll ABI=WINNT_x86-msvc

The "ABI" directive will give your right lib path under different platform.

In your javascript file, your could reference the lib path like this:

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);
    /// ...
}


来源:https://stackoverflow.com/questions/6175608/reference-a-binary-component-to-js-ctypes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!