2011-12-27 101 views
0

我正在尝试创建一个NPAPI插件来侦听macbook上的媒体密钥,并将其传递给javascript来控制像pandora或soundcloud之类的东西。我正在使用Spotify的SPMediaKeyTap库,它只是将CGEventTap封装在单独的线程上运行。在NPAPI插件中处理CGEventTaps

我的问题是,我使用npn_invoke回调到JavaScript。这工作正常,但是当它从CGEventTap回调触发时,它会崩溃插件。我意识到这需要从插件线程运行,并且我试图通过使用[NSObject performSelectorOnMainThread]和[NSObject performSelector:onThread]将它传回主线程,并将线程存储在main插件线程创建方法。这两种解决方案都会在任何npn通话中崩溃。处理导致状态对于NPN浏览器交互调用无效的CGEventTap事件时是否还有其他事情要做?

+2

有没有堆栈跟踪崩溃的地方?以及你如何调用NPN_Invoke的示例代码? – taxilian 2011-12-28 06:51:20

+0

所以在NPP_New中,我使用main_thread = [NSThread currentThread]存储了线程; 然后在处理程序SPMediaKeyTap,我调用[自performSelector:onThread:blahblah:]用main_thread 和崩溃在这条线: 浏览器的>的GetValue(例如,NPNVWindowNPObject,&窗口); 我不确定如何获取NPAPI插件中的堆栈跟踪... – msfeldstein 2012-01-10 03:52:59

+0

当我访问该浏览器对象(NPNetscapeFuncs *)时,它似乎崩溃。我认为发生的一件事情是主要Chrome进程中发生的关键事件,它无法访问插件进程中的浏览器变量。我在该行上获得了EXC_BAD_ACCESS/KERN_PROTECTION_FAILURE。如果我将命令存储到一个静态变量中,然后在HandleEvent中检查它并在那里调用JS函数,它工作正常。我只需要一些方法来告诉插件在UI过程的插件过程中做些什么。 – msfeldstein 2012-01-10 05:56:51

回答

0

不要尝试像保存线程一样猜测线程模型;只需使用performSelectorOnMainThread来调用NPN方法即可。我一直这样做,并且工作正常,所以我猜测你的跨线程编组方法不能满足需要。