最近做一个项目,用到了NPN_PluginThreadAsyncCall,但是网上这方面的资料比较少,自己经过大量的搜寻与测试,终于搞定!
NPN_PluginThreadAsyncCall 这个可以实现插件主动调用js函数,在插件加载运行后,如果是不定时的需要给js页面传递数据,此函数效果不错!
现将这个函数的用法做个总结!
1)在 np_entry.cpp文件中的方法NP_Initialize
添加 NPNFuncs.pluginthreadasynccall = pFuncs->pluginthreadasynccall;
2)在npn_gate.cpp文件中添加
void NP_LOADDS NPN_PluginThreadAsyncCall(NPP instance, void (*func) (void *), void *userData)
{
NPNFuncs.pluginthreadasynccall(instance, func, userData);
}
3)在plugin.h文件中添加如下代码:
NPObject *m_pJSCallbackFunObj;//在ScriptablePluginObject::SetProperty中赋值,记得初始化和释放
全局方法:void AsyncCallFunc(void* pParm);
添加CPlugin方法:void CallAsyncCallFunc();
4)在plugin.cpp文件中添加全局方法
void AsyncCallFunc(void* pParm)
{
CPlugin* pTemp = reinterpret_cast<CPlugin*>(pParm);
if (pParm == 0)
{
return;
}
pTemp->CallJsFunc(111);//具体的调用js的方法!
}
5)调用js的方法
bool CPlugin::CallJsFunc(int nvalue)
{
if (!m_pJSCallbackFunObj)
{
NPVariant args[1];
NPVariant rev;
INT32_TO_NPVARIANT(nvalue,args[0]);
NPVariant result;
NPN_InvokeDefault(m_pNPInstance, m_pJSCallbackFunObj, args, 1, &result);//m_pJSCallbackFunObj 自定义的NPObject * 类型的js函数指针,自己赋值
NPN_ReleaseVariantValue(&result);
}
return true;
}
6)实现类方法
void CPlugin::CallAsyncCallFunc()
{
NPN_PluginThreadAsyncCall(m_pNPInstance, &AsyncCallFunc, this);
}
7)在插件的注册的回调的函数中或者是新建的线程里, 调用CallAsyncCallFunc方法即可。