@ -15,6 +15,7 @@ import java.io.File;
import java.io.FileOutputStream ;
import java.io.IOException ;
import java.io.InputStream ;
import java.lang.management.ManagementFactory ;
public class LibraryLoader {
@ -23,6 +24,8 @@ public class LibraryLoader {
static final String SWT_LIB_DIR = ".j2v8" ;
static final String MINIMUM_VERSION = "6.2" ;
static {
DELIMITER = System . getProperty ( "line.separator" ) ; //$NON-NLS-1$
SEPARATOR = System . getProperty ( "file.separator" ) ; //$NON-NLS-1$
@ -30,6 +33,7 @@ public class LibraryLoader {
/ * *
* Returns the base - name for the native J2V8 library file .
*
* @param withLinuxVendor include / exclude the { vendor } part from the returned filename
* < p > NOTE : Vendors are only included for linux systems < / p >
* @return The filename string has the following structure :
@ -141,6 +145,7 @@ public class LibraryLoader {
FileOutputStream os = null ;
InputStream is = null ;
File file = new File ( fileName ) ;
String absoluteName = file . getAbsolutePath ( ) ;
boolean extracted = false ;
try {
if ( file . exists ( ) ) {
@ -158,7 +163,7 @@ public class LibraryLoader {
os . close ( ) ;
is . close ( ) ;
chmod ( "755" , fileName ) ;
if ( load ( fil eName, message ) ) {
if ( load ( absolut eName, message ) ) {
return true ;
}
}
@ -191,4 +196,48 @@ public class LibraryLoader {
} 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 ignore ) {
}
}
} ) ;
}
}