2010-05-20 65 views
2

我正在開發基於CVM PhoneME VM的嵌入式平臺的應用程序管理器。 VM由配置CVM的C++應用程序啓動,然後觸發VM本身。這個C++應用程序是通過傳遞java應用程序的主類名和類路徑的命令行來調用的。有一個主要的Java應用程序(讓我們稱之爲管理器),它使用類加載器加載應用程序。我希望這個管理器是一個單一實例應用程序,因此它可以跟蹤所有正在運行的應用換句話說:我第一次啓動一個應用程序(例如app1)時,虛擬機將啓動並且管理器將加載app1。在進一步調用加載其他應用程序(app2,app3等)時,Manager的同一實例將加載這些應用程序。如何在java中實現單個實例應用程序管理器(CVM PhoneME)?

經理工作正常,但事實並非如此。

是否有可能做我想要的東西?

我發現這一點: http://www.knowledgesutra.com/forums/topic/59760-how-to-implement-single-instance-application-on-java/

這幾乎是一樣的我想,除了應用程序加載的一部分。但是,必需的軟件包在CVM實施中不可用。

回答

1

有多種方法可以強制執行應用程序的單個實例。例如,Firefox使用鎖定文件。

我看到的一種最常見的方式是無論啓動「管理器」,但在啓動時,嘗試在偵聽連接的某個端口上打開ServerSocket。

如果您無法打開套接字,則知道您不是單例實例。因此,代替啓動應用程序,連接到偵聽套接字並將其發送給程序參數。

如果您成功打開套接字,請執行在另一個線程上啓動app1時要求的內容,以偵聽作爲重複實例啓動的來自這些管理器的傳入連接。

編輯:它描述了在非ME環境中的過程。不是ME開發者,我不能評論它在手機上的可行性。

+0

感謝您的回答。 該解決方案看起來不錯。我會設法嘗試它。 您認爲可以從JVM執行從C++到應用程序運行實例的JNI調用嗎?我相信它可以很好地解決問題,但是我不習慣JNI。 謝謝。 – Marcus 2010-05-21 13:22:30

+0

@Marcus:其他人可以對此發表評論;我從來沒有機會使用JNI。但是我對它的一般理解是,JNI調用是另一個方向:所以Java可以調用本地代碼;通常不是相反的方式。 – 2010-05-21 13:57:34

+0

可以從C++到Java進行JNI調用。我在過去的幾天研究了這一點。主要的問題是不可能將一個不同的進程附加到以前創建的虛擬機上(至少我找不到方法,你知道它是否有可能嗎?)。 我現在的解決方案是讓VM守護進程守護進程。我打算使用IPC(InterProccess Comunication)調用來通知守護程序的新應用程序。這個人將會設法在正在運行的虛擬機中進行JNI調用。我只是要確定我要使用哪個IPC的選項。我的選擇是DBUS,但它可能會改變。 – Marcus 2010-05-23 14:53:58

相關問題