@ -15,6 +15,7 @@ import java.io.File;
import java.io.FileOutputStream ;
import java.io.FileOutputStream ;
import java.io.IOException ;
import java.io.IOException ;
import java.io.InputStream ;
import java.io.InputStream ;
import java.lang.management.ManagementFactory ;
class LibraryLoader {
class LibraryLoader {
@ -23,6 +24,8 @@ class LibraryLoader {
static final String SWT_LIB_DIR = ".j2v8" ;
static final String SWT_LIB_DIR = ".j2v8" ;
static final String MINIMUM_VERSION = "6.2" ;
static {
static {
DELIMITER = System . getProperty ( "line.separator" ) ; //$NON-NLS-1$
DELIMITER = System . getProperty ( "line.separator" ) ; //$NON-NLS-1$
SEPARATOR = System . getProperty ( "file.separator" ) ; //$NON-NLS-1$
SEPARATOR = System . getProperty ( "file.separator" ) ; //$NON-NLS-1$
@ -193,4 +196,49 @@ class LibraryLoader {
} catch ( Throwable e ) {
} catch ( Throwable e ) {
}
}
}
}
//内核版本windows NT6.2以下存在加载dll之后无法正常退出的问题,注册钩子函数退出时杀掉进程
static void checkExceptionVersion ( ) {
String version = System . getProperty ( "os.version" ) ;
if ( PlatformDetector . OS . isWindows ( ) & & belowMinimumVersion ( version ) ) {
registerExit ( ) ;
}
}
//低于指定版本,6.2以下
private static boolean belowMinimumVersion ( String version ) {
return compareVersion ( version , MINIMUM_VERSION ) < 0 ;
}
private static int compareVersion ( String version1 , String version2 ) {
String [ ] versionArray1 = version1 . split ( "\\." ) ; //注意此处为正则匹配,不能用".";
String [ ] versionArray2 = version2 . split ( "\\." ) ;
int idx = 0 ;
int minLength = Math . min ( versionArray1 . length , versionArray2 . length ) ; //取最小长度值
int diff = 0 ;
while ( idx < minLength
& & ( diff = versionArray1 [ idx ] . length ( ) - versionArray2 [ idx ] . length ( ) ) = = 0 //先比较长度
& & ( diff = versionArray1 [ idx ] . compareTo ( versionArray2 [ idx ] ) ) = = 0 ) { //再比较字符
+ + idx ;
}
//如果已经分出大小,则直接返回,如果未分出大小,则再比较位数,有子版本的为大;
diff = ( diff ! = 0 ) ? diff : versionArray1 . length - versionArray2 . length ;
return diff ;
}
//低于指定版本,6.2以下
private static void registerExit ( ) {
Runtime . getRuntime ( ) . addShutdownHook ( new Thread ( ) {
@Override
public void run ( ) {
String name = ManagementFactory . getRuntimeMXBean ( ) . getName ( ) ;
String pid = name . split ( "@" ) [ 0 ] ;
try {
Runtime . getRuntime ( ) . exec ( "taskkill /F /PID " + pid ) ;
} catch ( Exception ex ) {
System . exit ( 0 ) ;
}
}
} ) ;
}
}
}