2012-04-06 69 views
1

我正在編寫一個使用c中編寫的硬件驅動程序的Java程序。這個硬件驅動程序啓動一個回調線程,並且你可以註冊回調函數,當有事情發生時被調用。如何將此線程附加到jvm,以便它可以調用這些回調的Java方法?我只有從start_callbacks()函數返回的線程ID,作爲int返回,但是它是調用pthread_create()時使用的pthread_t。使用jni時將第三方線程連接到vm

我發現的一種方法是在每個回調函數的開始處使用pthread_once並在那裏附加線程。但是,那麼沒有辦法將它分開。我試圖使用pthread_cleanup_push/pop,但是它們需要作爲一對來調用,因此不起作用。

在我看來,我唯一的選擇就是在每個回調調用中附加和分離線程。或者有點重寫驅動程序,我真的不想這樣做。

有什麼我錯過了嗎?

+0

這可能是無益的,但你有沒有考慮在C中實現程序,並使用System.exec或其他東西將它連接到Java?您目前的做法在技術上似乎對我有風險。 – 2012-04-06 02:38:24

回答

2

這正是JNI所調用的AttachCurrentThread()DetachCurrentThread()的用途。

+0

是的,我知道。但是我不自己創建線程,那麼如何讓線程調用AttachCurrenThread和DetachCurrentThread?我可以讓線程執行的唯一代碼是回調函數。 – liei 2012-04-06 08:50:21

+0

您不需要'線程來調用AttachCurrentThread()''。它附加當前線程。這就是爲什麼它被稱爲'AttachCurrentThread()'。顯然你必須在回調函數中調用這些方法。 – EJP 2012-04-06 09:36:29

+0

我知道這是問題的解決方案,每次進行回調時都會附加和分離。但我希望有一種方法可以讓線程在適當的時候調用AttachCurrentThread和DetachCurrentThread,只需要一次。所以我不需要在每次回調時附加線程。我可能高估了線程的代價是多少,回調的頻率是幾秒鐘,所以它可能不成問題。我只是希望將線程連接和分離一次,是否每次打電話時都需要連接和分離的正確方法? – liei 2012-04-06 11:27:18