プラグインの作成にはFireBreathを使用することを強くお勧めします。それはあなたのために難しいことのほとんどを解決するでしょう、そしてあなたは非同期呼び出しをする方法についてのチュートリアルを見つけることができます。
これを行わないことを選択した場合は、基本的にjavascript関数を渡す必要があります。これはNPAPIではNPObjectになり、アクションが完了したら、コールバックNPObjectでNPN_InvokeDefaultを使用します。もちろん、これはメインスレッドで行う必要があります。これには、メインスレッドにメッセージを送信して、呼び出しを行うように指示する何らかのメソッドが必要になります。
一般的に言えば、NPN_PluginThreadAsyncCallはこれを行います。関数ポインタと必要なデータを含むvoid*を指定すると、メインスレッドで関数が呼び出されます。残念ながら、WindowsとMacの両方のSafari 5.1は、この機能のサポートを終了したようです。Windowsでの代替手段は、LPARAMの不透明なポインタを使用してメッセージHWNDとPostMessageを作成することです。Macでは、PerformSelectorOnMainThreadまたはNSTimerを使用できます。Linuxでそれを行う方法がわかりません。
もちろん、FireBreathがすべてを処理し、任意のスレッドから呼び出すことができるJSObjectPtrでコールバックをラップするだけです...これを呼び出すと、firebreathが正しいスレッドで呼び出しを行います。IEでも動作します...しかしそれはあなた次第です。私はFireBreathのほとんどを書いていて、少し偏見があるので、他のオプションを提供しようとしています。
(私が偏見を持っているからといって、私が間違っているという意味ではありません)
幸運を!