2012-04-06 6 views
1

私はcで書かれたハードウェアドライバを使用するJavaプログラムを作成しています。このハードウェアドライバは、コールバックスレッドを開始し、何かが起きたときに呼び出されるコールバック関数を登録できます。これらのコールバックのためにJavaメソッドを呼び出すことができるように、このスレッドをjvmにどのように付加できますか? start_callbacks()関数から戻されたスレッドIDはintとして返されますが、pthread_create()の呼び出しで使用されるのはpthread_tです。jniを使用するときにサードパーティのスレッドをVMに接続する

私が見つけた1つの方法は、すべてのコールバック関数の開始時にpthread_onceを使用し、そこでスレッドをアタッチすることです。しかし、それを切り離す方法はありません。私はpthread_cleanup_push/popを使用しようとしましたが、ペアで呼び出されなければ動作しませんでした。

この権利を行う私の唯一の選択肢は、コールバックコールごとにスレッドをアタッチして切り離すことです。または、私が実際にやりたくないドライバをいくらか書き換えます。

私が見逃したことはありますか?

+0

これはおそらく役に立たないかもしれませんが、Cでプログラムを実装し、System.execなどを使ってJavaに接続すると考えましたか?あなたの現在のアプローチは技術的に危険なようです。 –

答えて

2

これは、JNIがAttachCurrentThread()およびDetachCurrentThread()と呼ぶものです。

+0

はいわかっています。しかし私はスレッドを自分で作成しないので、スレッドをAttachCurrenThreadとDetachCurrentThreadを呼び出す方法を教えてください。スレッドを実行できるようにするコードは、コールバック関数だけです。 – liei

+0

AttachCurrentThread()を呼び出すためのスレッドは必要ありません。現在のスレッドをアタッチします。それがAttachCurrentThread()と呼ばれる理由です。明らかに、これらのメソッドはコールバック関数の中で呼び出さなければなりません。 – EJP

+0

私はそれがコールバックが行われるたびに、接続と切り離しの問題に対する解決策であることを知っています。しかし、私はスレッドがAttachCurrentThreadとDetachCurrentThreadを適切な時間に一度だけ呼び出す方法があることを望んでいました。コールバックが作成されるたびにスレッドをアタッチする必要はありません。私は、スレッドの接続にどれくらいのコストがかかるかを過大評価しているかもしれません。コールバックの頻度は数秒です。問題ではないかもしれません。私はちょうど一度スレッドをアタッチして取り外すことを好みましたが、コールが行われるたびにアタッチとデタッチを行う正しい方法ですか? – liei

関連する問題