在做java桌面应用程序时,双击程序的快捷启动图标,桌面程序就会打开。再次双击,又会打开一个新的桌面应用程序。如果软件中的某些值是不允许共享和并发的,比如端口占用等。因此必须找到一种方法使得无论双击多少次启动图标,我们的应用程序都只会打开一个。那么该怎么解决呢?


我想到的大概有两种方法:

1.在本地应用程序的目录下,新建一个文件,文件中可存储一个作为标记的变量,设为flag,每次运行应用程序时,都读取和赋值给flag,进而来判断软件是否已经被打开。然后再做相关的处理。

2.利用jni的方法,通过操作系统来判断应用程序的进程是否已经存在。

我是用第二种方法做的。下面简要说一下步骤:

(1)在java工程中创建本地化结构方法,设为private native int getInstance();

(2)编译运行java文件,得到class文件,利用jni命令生成对应的.h头文件,注意路径中的空格

(3)在VC中创建一个空的dll文件,实现上述.h头文件中的包含的本地化方法,代码如下: 
 
 
  
  1. #include <jni.h> 
  2. #include <windows.h> 
  3. #include "com_TestSingle.h" //由jni命令根据java文件生成的.h头文件 
  4.  
  5. HANDLE hMutex; 
  6.  
  7. JNIEXPORT jint JNICALL Java_com_TestSingle_getInstance(JNIEnv *env, jobject obj) 
  8.   hMutex = CreateMutex(NULL, FALSE, "SingletonInstance"); 
  9.   if(hMutex) 
  10.   { 
  11.    if(GetLastError() == ERROR_ALREADY_EXISTS) 
  12.    { 
  13.      return JNI_TRUE; 
  14.     } 
  15.   } 
  16.  
  17.   return JNI_FALSE; 
其中CreateMutex的解释见http://bike.baidu.com/view/1285853.html?fromTaglist

参数中字符串“SingletonInstance”是随意起的,这个无所谓

(4)编译,运行后将生成的dll文件放到java源文件中去加载

(5)在java类的构造函数或者初始化的某个地方加上判断即可,实例代码如下
 
 
  
  1. if(getInstance() == 1
  2.     JOptionPane.showMessageDialog(null"程序已经在运行!"); 
  3.     System.exit(0); 
  4. }