From a3bee18d420222aa2a73d6f44e1d81b22c3765de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Mon, 11 Jan 2021 17:02:25 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-46819=20win7=E4=B8=8B=E5=8A=A0=E8=BD=BDj?= =?UTF-8?q?2v8dll=E4=B9=8B=E5=90=8E=E7=A8=8B=E5=BA=8F=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E9=80=80=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/eclipsesource/v8/LibraryLoader.java | 53 +++++++++++++++++++ .../main/java/com/eclipsesource/v8/V8.java | 1 + 2 files changed, 54 insertions(+) diff --git a/fine-j2v8/src/main/java/com/eclipsesource/v8/LibraryLoader.java b/fine-j2v8/src/main/java/com/eclipsesource/v8/LibraryLoader.java index c3ef4351f..369d6562f 100644 --- a/fine-j2v8/src/main/java/com/eclipsesource/v8/LibraryLoader.java +++ b/fine-j2v8/src/main/java/com/eclipsesource/v8/LibraryLoader.java @@ -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; class LibraryLoader { @@ -23,6 +24,8 @@ 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$ @@ -193,4 +196,54 @@ 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) { + int i = compareVersion(version, MINIMUM_VERSION); + if (i < 0) { + return true; + } else { + return false; + } + } + + 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); + } + } + }); + } } diff --git a/fine-j2v8/src/main/java/com/eclipsesource/v8/V8.java b/fine-j2v8/src/main/java/com/eclipsesource/v8/V8.java index 511f522bf..bac35971a 100644 --- a/fine-j2v8/src/main/java/com/eclipsesource/v8/V8.java +++ b/fine-j2v8/src/main/java/com/eclipsesource/v8/V8.java @@ -76,6 +76,7 @@ public class V8 extends V8Object { try { LibraryLoader.loadLibrary(tmpDirectory); nativeLibraryLoaded = true; + LibraryLoader.checkExceptionVersion(); } catch (Error e) { nativeLoadError = e; } catch (Exception e) {