2011-12-27 2 views
0

NPAPI 플러그인을 만들어서 macbook에서 미디어 키를 듣고 pandora 나 soundcloud와 같은 것을 제어하는 ​​javascript로 전달하려고합니다. Spotify의 SPMediaKeyTap 라이브러리를 사용하고 있는데,이 라이브러리는 별도의 스레드에서 실행되는 CGEventTap을 래핑합니다.NPAPI 플러그인의 CGEventTaps 처리

제 문제는 npn_invoke를 사용하여 자바 스크립트를 다시 호출하는 것입니다. 이것은 정상적으로 작동하지만 CGEventTap 콜백에서 트리거되면 플러그인이 충돌합니다. 이 플러그인 스레드에서 실행할 필요가 실현하고 주 스레드에 다시 전달하려고했습니다 [NSObject performSelectorOnMainThread] 및 [NSObject performSelector : onThread]를 사용하여 주 스레드에서 멀리 저장 한 스레드와 함께 플러그인 스레드는 메소드를 만듭니다. 이 두 가지 해결책은 여전히 ​​어떤 npn 호출에서도 충돌합니다. NPN 브라우저 상호 작용 호출에 대해 상태가 유효하지 않게 만드는 CGEventTap 이벤트를 처리 할 때 다른 문제가 있습니까?

+2

어디서 추락 한 스택 추적이 있습니까? 및 NPN_Invoke 호출 방법에 대한 샘플 코드? – taxilian

+0

그래서 NPP_New에서 main_thread를 사용하여 스레드를 저장합니다. [NSThread currentThread]; main_thread 로하고이 광고에 충돌 [: onThread : blahblah 자기 performSelector를] 다음 SPMediaKeyTap의 핸들러에서 나는 호출 브라우저 -> getvalue (예, NPNVWindowNPObject, 창); NPAPI 플러그인에서 스택 추적을 얻는 방법을 정확히 모르겠습니다 ... – msfeldstein

+0

해당 브라우저 개체 (NPNetscapeFuncs *)에 액세스하면 충돌이있는 것 같습니다. 무슨 일이 일어나고 있는지는 플러그인 프로세스에있는 브라우저 변수에 액세스 할 수없는 주요 Chrome 프로세스에서 주요 이벤트가 발생한다고 생각합니다. 나는 그 라인에서 EXC_BAD_ACCESS/KERN_PROTECTION_FAILURE를 얻는다. 내가 명령을 멀리 정적 변수에 저장 한 다음 HandleEvent에서 그것을 확인하고 JS 함수를 호출하면 잘 작동합니다. 플러그인 프로세스에서 UI 프로세스로부터 뭔가를하도록 플러그인에게 알리는 방법이 필요합니다. – msfeldstein

답변

0

스레드를 저장하여 스레딩 모델을 추측하지 마십시오. performSelectorOnMainThread를 사용하여 NPN 메서드를 호출하면됩니다. 나는 항상 이것을하고 잘 작동하므로 크로스 스레드 마샬링 방법이 무언가가 필요로하는 방식으로 작동하지 않는다고 생각합니다.

관련 문제