2

C のスレッドによってキャプチャされたイベントをリッスンして応答する Java プログラムを作成したいと思います。
誰かが JNI を使用してこれを達成する方法を説明したり、オンライン チュートリアルを教えてもらえますか?

ありがとうございました。

4

2 に答える 2

2

ネイティブコードでJavaメソッドを呼び出して、イベントを受信することができます。JNIを使​​用してCからJava関数を呼び出す方法など、JNIに関するいくつかの記事が役立ちます。

于 2009-01-17T18:38:50.163 に答える
2

何らかの種類の JNI プログラミングを行いたい場合は、JNI 仕様を読む必要があります

C から Java コードを呼び出す場合、2 つのシナリオがあります。最初のケースでは、Java プログラムがネイティブメソッドを呼び出し、制御を C に渡します。C 関数は、最初の引数としてJNIEnv、JNI へのアクセスに使用されるプライマリ ハンドルであるポインタを受け取ります。Java から C への典型的な呼び出しは次のようになります。

jenv->CallStaticMethod(jenv, cls, ...);

(C++ では、呼び出しは適切なメソッドであるため、最初の引数として渡す必要がないことに注意してくださいjenv。) これはかなり単純です。Java は、Java にコールバックする C を呼び出します。

2 番目のケースはもう少し複雑で、Java への「自発的な」呼び出しを行う必要がある C コードがある場合に使用する必要があります。つまり、そのコードが最初に Java から呼び出された結果としてではありません。これは通常、イベントを生成するネイティブスレッドがある場合です(あなたの場合のように)。次に、呼び出し APIと呼ばれる JNI の一部を使用する必要があります。この API は 2 つのステップで使用されます。最初に、呼び出す JVM への参照を要求し (一部の JVM 実装では、同じプロセスで複数の JVM をサポートします)、2 番目のステップでJNIEnv、JVM を呼び出すためにポインターを要求します。 .

JVM への呼び出しを行うためのポインタを取得するにJNIEnvは、ネイティブ スレッドがそれ自体を JVM に「接続」する必要があります。これは、JVM がスレッドを「認識する」ようにするために行われます。スレッドを JVM に接続した後、スレッドは他の Java スレッドと見なすことができます (実際、スレッドが存在するかどうかはわかりません)。実際の違い)。デバッガーで JVM のスレッドを調べると、ネイティブ スレッドが他のスレッドとして表示されます。ネイティブ スレッドをデーモン スレッドとしてマークできるので、JVM が終了するとスレッドが強制終了されることに注意してください。

ただし、Unix シグナル ハンドラで何かを行う場合は、適切な予防措置を講じる必要があることに注意してください。シグナル ハンドラから直接 Java を呼び出さないことをお勧めします。

于 2009-01-19T20:44:47.563 に答える