2011-12-27 8 views
0

NPAPIプラグインを作成して、macbookのメディアキーを聞き、それをjavascriptに渡してpandoraやsoundcloudなどのものを制御しようとしています。 SpotifyのSPMediaKeyTapライブラリを使用しています。これはCGEventTapを別のスレッドでラップするだけです。NPAPIプラグインでのCGEventTapsの処理

私の問題は、npn_invokeを使用してjavascriptに戻ることです。これは正常に動作しますが、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メソッドを呼び出してください。私はこれを常に行い、それはうまくいくので、クロススレッドマーシャリングの方法で何かが必要な方法で動作していないと推測しています。

関連する問題