【问题标题】:NPAPI plugin does not show in about:plugins in google chromeNPAPI 插件未显示在 about:plugins in google chrome
【发布时间】:2012-04-10 15:46:37
【问题描述】:

我已经浏览了这个论坛中关于这个问题的问题,但我没有找到任何与我所面临的问题相关的问题。我已经编写了一个 NPAPI 插件,它可以与 GtkLauncher(带有 webkit)和 firefox 一起正常工作,但是对于 google-chrome(18.0.1025.151),该插件甚至没有出现在 about:plugins 中。我在 Ubuntu 10.10 上运行。

当我在 google-chrome 中加载插件时,在浏览器中出现加载插件失败错误,但控制台上没有显示任何内容。我怀疑我的 NP_Initialize 函数是否被调用。

这里是 NP_Initialize 代码:

-------------------------------
NPError OSCALL
NP_Initialize(NPNetscapeFuncs *npnf
#if !defined(_WINDOWS) && !defined(WEBKIT_DARWIN_SDK) 
    , NPPluginFuncs *nppfuncs)
#else
)
#endif

{
MEDIA_DEBUG_PRINT("\nwcf Media plugin: NP_Initialize");
    if(npnf == NULL)
        return NPERR_INVALID_FUNCTABLE_ERROR;
    if(HIBYTE(npnf->version) > NP_VERSION_MAJOR)
        return NPERR_INCOMPATIBLE_VERSION_ERROR;

    npnfuncs = npnf;

    #if !defined(_WINDOWS) && !defined(WEBKIT_DARWIN_SDK)
        NP_GetEntryPoints(nppfuncs);                            
    #endif

    return NPERR_NO_ERROR;

}

NPError OSCALL
NP_GetEntryPoints(NPPluginFuncs *nppfuncs) 
{

    MEDIA_DEBUG_PRINT("\nwcf Media plugin: NP_GetEntryPoints"); 
    nppfuncs->version = (NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR; 
    nppfuncs->newp = nevv; 
    nppfuncs->destroy = destroy; 
    nppfuncs->getvalue = getValue; 
    nppfuncs->event = handleEvent; 
    nppfuncs->setwindow = setWindow; 

    return NPERR_NO_ERROR;
}

我知道有一个用于跨浏览器开发的 Firebreath 框架,我计划使用它,但目前我需要让我的插件在 chrome 上运行。

有人可以帮我解决我的问题吗?

感谢和问候, 苏维克

【问题讨论】:

    标签: npapi


    【解决方案1】:

    Chrome 往往对事情的启动方式有点挑剔。我在这里看不到任何可能导致您的问题的东西,但 Chrome 因拒绝不符合预期的插件而臭名昭著。您的问题很可能在以后出现;你说你怀疑你的 NP_Initialize 是否被调用,如果我是你,我会验证这一点。让它写入 /tmp/ 中的文件或其他文件以确保。

    此外,您还没有提供任何其他入口点,例如 NP_GetPluginVersion 或 NP_GetMimeDescription。这些对于 linux 插件也是必需的,并且很可能会导致这样的问题。供参考,请查看FireBreath's X11 entrypoint file

    最后,你安装插件的方式有可能是mozilla而不是chrome找到的;你是怎么安装的?

    【讨论】:

    • 感谢您的回复。实际上,我已经给出了控制台打印 - MEDIA_DEBUG_PRINT("\nwcf Media plugin: NP_Initialize");在 NP_Initialize() 函数中,在 Chrome 中加载时未打印。
    • 是的,我知道您有控制台打印;但是,我完全不确定您是否会看到该打印的结果,因为您与 chrome 处于不同的进程中,而我的经验是 stdout 经常被重定向到那些案例。如果您将其发送到文件中,那么您可以确定。
    • 好的,我会立即检查。我正在创建我的 .so 文件到 /usr/lib/mozilla/plugins 文件夹的软链接。我也有 MIME 和版本的入口函数。以下是内容: char* NP_GetMIMEDescription(void){return (char*)"application/x-wcfconn:wcf:This is a Connectivity plugin";} char * NP_GetPluginVersion(){return (char*)PLUGIN_VERSION;}跨度>
    • 在 NP_Initialize 中,我创建了一个文件 /tmp/test 并写了一个字符串。当我尝试在 Chrome 中加载插件时,未创建此文件。但是当我在 GtkLauncher 中加载插件时,会创建和写入相同的文件。所以似乎我的 NP_Initialize 函数没有在 Chrome 中被调用。
    • 如果您要添加代码和详细信息,最好编辑原始问题并将它们放在那里;在这里很难阅读。尝试将您的插件放入 /usr/lib/chromium-browser/plugins 而不是 /usr/lib/mozilla/plugins;可能是那个 6 铬看起来不在那里。另外我希望您的意思是符号链接而不是软链接 =]
    【解决方案2】:

    如果您的插件未显示在 chrome://plugins 中,则说明它在初始插件扫描期间失败。尝试使用--debug-plugin-loading 标志运行,它应该会在注册插件失败时为您提供日志语句。

    【讨论】:

    • 非常感谢。使用 --debug-plugin-loading 启动 google-chrome 后,我可以获得一些控制台日志。在控制台日志中,我注意到我的插件无法加载另一个库 DBAccessLib(我自己的库,我用来通过绑定到 sqlite3 来访问数据库)。它给出了错误:未定义的符号:sqlite3_sprintf),正在跳过。可能是 google chrome 找不到 libsqlite3 库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多