2010-05-20 64 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

相关问题