感谢您的帮助和建议。
即使我将 .so 文件放在正确的文件夹 /usr/lib/mozilla/plugins/ 和 Qt Lib 路径中,我也能够找出为什么我的插件没有被调用的问题。
有2个原因...
必须在编译期间启用定义 XP_UNIX (-DXP_UNIX) 作为编译器指令。这将考虑功能的不同原型以及实现
extern "C"
NPError OSCALL NP_Initialize(NPNetscapeFuncs *browserFuncs
#ifdef XP_UNIX
, NPPluginFuncs *pluginFuncs
#endif
)
{
// keep a pointer to the browser functions
g_browser = browserFuncs;
// any memory that is to be shared by all instances of
the browser plugin should be initialized here.
;
#ifdef XP_UNIX
// under Linux, as the browser won't call NP_GetEntryPoints()
explicitly, do it now to fill in <pluginFuncs>
return NP_GetEntryPoints(pluginFuncs);
#else
return NPERR_NO_ERROR;
#endif
}
和
extern "C"
#ifdef XP_UNIX
NPError NP_GetValue(void* instance, NPPVariable variable, void *value)
#else
NPError NP_GetValue(NPP instance, NPPVariable variable, void *value)
#endif
2.. 有 2 个函数 NP_GetValue 和 NPP_GetValue。
extern "C"
NPError NP_GetValue(void* instance, NPPVariable variable, void *value);
和
NPError NPP_GetValue(NPP instance, NPPVariable variable, void *ret_value);
NPP_GetValue 是一个插件函数,其注册应在 NP_GetEntryPoints 中进行
extern "C"
NPError OSCALL NP_GetEntryPoints(NPPluginFuncs* NPPluginFuncsptr)
{
......
NPPluginFuncsptr->newp = NPP_New;
NPPluginFuncsptr->getvalue = NPP_GetValue;
NPPluginFuncsptr->setvalue = NPP_SetValue;
return NPERR_NO_ERROR;
}
在我的代码中,仅实现了 NP_GetValue 而未实现 NPP_GetValue。所以 NPP_GetValue 在 .so 中未定义,因此 .so 没有加载。
在实现函数 NPP_GetValue 时,该函数被定义并导出到 .so 文件中,并且能够成功加载它。
从浏览器到插件的函数调用顺序如下...
NP_Initialize -> 浏览器首先调用初始化函数。(在 Linux 的情况下,应通过显式调用 NP_GetEntryPoints 导出插件函数集,因为浏览器不会调用 GetEntryPoints)
NP_GetEntryPoints -> 从 NP_Initialize for Linux 显式调用以公开/导出插件函数。
NP_GetValue 变量:1 -> 从浏览器调用以获取插件名称 (NPPVpluginNameString)
NP_GetValue 变量:2 -> 从浏览器调用以获取插件描述 (NPPVpluginDescriptionString)
NP_GetMimeDescription -> 从浏览器调用以获取 MimeType 描述(此函数应返回 Mime 类型描述,例如:return("application/basic-plugin:bsc:Plug-ins SDK sample");)
NPP_New -> 从浏览器调用以创建插件实例。
NPP_GetValue PLUGIN:main.cpp,NPP_GetValue,446ENTRY - > 从浏览器调用以获取插件特定数据...
……
请注意,如果且仅当前一个函数调用返回成功时,才会调用上述序列中的下一个函数。:-)