NPAPI插件在谷歌浏览器的about:plugins中没有显示。

3
我已经浏览了这个论坛中关于此问题的所有问题,但我没有找到任何与我面临的问题相关的查询。我编写了一个NPAPI插件,它可以在带有webkit的GtkLauncher和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上运行。

请问有没有人能帮我解决这个问题?

谢谢和问候, Souvik

2个回答

3
Chrome对启动方式有点挑剔。我没有看到任何可能导致您问题的内容,但是Chrome以拒绝不按其预期行事的插件而闻名。最可能的是您的问题出现在后面;您说您怀疑NP_Initialize没有被调用,如果我是您,我会验证一下。将其写入/tmp/文件中或其他位置以确保。

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

最后,您安装插件的方式可能会使其被Mozilla找到而不是Chrome。您是如何安装它的?


谢谢您的回复。实际上,我在NP_Initialize()函数中放置了一个控制台打印——MEDIA_DEBUG_PRINT("\nwcf Media plugin: NP_Initialize"),但在Chrome中加载时未能打印出来。 - Souvik
是的,我知道你有一个控制台打印;然而,我并不确定你是否有可能看到那个打印的结果,因为你在一个与Chrome分离的进程中,我的经验是stdout在这些情况下经常被重定向到其他地方。如果你将它发送到文件中,那么你就可以确定了。 - taxilian
好的,我会立即检查。我正在将我的.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;} - Souvik
在 NP_Initialize 函数中,我创建了一个名为 /tmp/test 的文件并写入了一个字符串。当我尝试在 Chrome 中加载插件时,该文件没有被创建。但是当我在 GtkLauncher 中加载插件时,同样的文件被创建并写入了内容。因此,看起来我的 NP_Initialize 函数在 Chrome 中没有被调用。 - Souvik
如果您正在添加代码和详细信息,最好编辑原始问题并将它们放在那里;在这里阅读很困难。尝试将您的插件放在/usr/lib/chromium-browser/plugins而不是/usr/lib/mozilla/plugins中,可能是因为chrome没有查找到该文件夹。另外,我希望您指的是符号链接而不是软链接=] - taxilian

2

如果您的插件没有在chrome://plugins中显示,则说明它在初始插件扫描过程中失败了。尝试使用--debug-plugin-loading标志运行,这将在注册插件失败的点处生成日志语句。


非常感谢。在使用--debug-plugin-loading启动google-chrome后,我可以获得一些控制台日志。在控制台日志中,我注意到我的插件无法加载另一个库DBAccessLib(我自己的库,用于通过绑定到sqlite3访问数据库)。并且它会给出错误:undefined symbol:sqlite3_sprintf),跳过。也许google chrome无法找到libsqlite3库。 - Souvik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接