From 8a87e4226aa802d6a0e3566c66824fedf68e77da Mon Sep 17 00:00:00 2001 From: aijinhui <aijinhui> Date: 星期二, 24 十月 2023 16:30:48 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ard-work/src/main/java/com/ruoyi/device/dhsdk/lib/LibraryLoad.java | 387 ++++++++++++++++++++++++++++--------------------------- 1 files changed, 198 insertions(+), 189 deletions(-) diff --git a/ard-work/src/main/java/com/ruoyi/device/dhsdk/lib/LibraryLoad.java b/ard-work/src/main/java/com/ruoyi/device/dhsdk/lib/LibraryLoad.java index af9a250..9fa85e9 100644 --- a/ard-work/src/main/java/com/ruoyi/device/dhsdk/lib/LibraryLoad.java +++ b/ard-work/src/main/java/com/ruoyi/device/dhsdk/lib/LibraryLoad.java @@ -1,189 +1,198 @@ -package com.ruoyi.device.dhsdk.lib; - -import com.ruoyi.device.dhsdk.lib.DynamicParseUtil; -import org.xml.sax.SAXException; - -import javax.xml.parsers.ParserConfigurationException; -import java.io.*; - -/** - * @author 47081 - * @version 1.0 - * @description 鍔ㄦ�佸簱鍔犺浇 - * @date 2020/11/14 - */ -public class LibraryLoad { - private static final String ARCH_WINDOWS = "win"; - private static final String ARCH_LINUX = "linux"; - private static final String ARCH_MAC = "mac"; - private static final int PREFIX_64 = 64; - private static final int PREFIX_32 = 32; - private static final String PREFIX_ARM = "ARM"; - private static final String EXTERNAL_WIN = ".dll"; - private static final String EXTERNAL_LINUX = ".so"; - private static final String EXTERNAL_MAC = ".dylib"; - private static DynamicParseUtil dynamicParseUtil; - /** 褰撳墠璇诲彇鐨勭洰褰� */ - private static String currentFold; - /** 鍔ㄦ�佸簱闇�瑕佸啓鍏ョ殑鐩綍 */ - private static String EXTRACT_PATH = System.getProperty("java.io.tmpdir"); - - private static boolean written = false; - - /** - * 璁剧疆鍔ㄦ�佸簱鍐欏叆鐨勮矾寰�,閫傜敤浜庨渶瑕佽嚜瀹氫箟鍔犺浇璺緞鐨勭敤鎴� - * - * @param path 鍔ㄦ�佸簱鍐欏叆鐨勬枃浠跺す,浠庤鏂囦欢澶逛笅鍔犺浇sdk鐨勫姩鎬佸簱 - */ - public static void setExtractPath(String path) { - EXTRACT_PATH = path; - } - - public static String getExtractPath() { - return EXTRACT_PATH; - - } - /** 鍔ㄦ�佸簱璺緞 */ - private static String INNER_PATH; - - // private static final String EXTERNAL_MAC = ".so"; - - private static String extractNetSDKLib(String libName) { - return extractLibrary(libName); - } - - public static String getLoadLibrary(String libraryName) { - currentFold = getLibraryFold(); - if (dynamicParseUtil == null) { - try { - dynamicParseUtil = - new DynamicParseUtil( - LibraryLoad.class.getClassLoader().getResourceAsStream("dynamic-lib-load.xml")); - if (!written) { - for (String libName : dynamicParseUtil.getLibsSystem(currentFold)) { - extractLibrary(libName); - } - written = true; - } - } catch (Exception e) { - e.printStackTrace(); - } - } - String fullName = getLibraryName(libraryName); - String path = EXTRACT_PATH; - if (!(EXTRACT_PATH.endsWith("/") || EXTRACT_PATH.endsWith("\\"))) { - path = EXTRACT_PATH + "/"; - } - System.out.println("load library: " + path + fullName); - return path + fullName; - } - - /** - * 灏唈ar鍖呴噷鐨勫姩鎬佸簱鍐欏叆鍒扮郴缁熺紦瀛樼洰褰�,浣跨敤缁濆璺緞鍔犺浇鍔ㄦ�佸簱 - * - * @param libName - * @return - */ - private static String extractLibrary(String libName) { - return extractLibrary("", libName); - } - - /** - * 鐩稿璺緞鏂囦欢澶� - * - * @param relativePath 鐩稿璺緞 - * @param libName 鍔ㄦ�佸簱璺緞 - * @return - */ - private static String extractLibrary(String relativePath, String libName) { - if (libName.trim().equals("")) { - return ""; - } - String libFullName = getLibraryName(libName); - String dir = getLibraryFold(); - if (!(relativePath.endsWith("/") || relativePath.endsWith("\\"))) { - relativePath = relativePath + "/"; - } - String fileName = relativePath + dir + "/" + libFullName; - InputStream in = LibraryLoad.class.getResourceAsStream(fileName); - BufferedInputStream reader; - FileOutputStream writer; - File extractedLibFile = null; - try { - if (in == null) { - in = new FileInputStream(fileName); - } - String nativeTempDir = EXTRACT_PATH; - if (!(nativeTempDir.endsWith("/") || nativeTempDir.endsWith("\\"))) { - nativeTempDir = nativeTempDir + "/"; - } - extractedLibFile = new File(nativeTempDir + libFullName); - reader = new BufferedInputStream(in); - writer = new FileOutputStream(extractedLibFile); - byte[] buffer = new byte[1024]; - while (true) { - int len = reader.read(buffer); - if (len == 0 || len == -1) break; - writer.write(buffer, 0, len); - } - reader.close(); - writer.close(); - in.close(); - } catch (Exception e) { - //System.out.println("dynamic file[ "+ fileName+ " ] not found in project.please ensure you need this library."); - } - return extractedLibFile != null ? extractedLibFile.getAbsolutePath() : ""; - } - - /** - * 鑾峰彇鍔ㄦ�佸簱瀹屾暣鍚嶇О - * - * @param libName - * @return - */ - private static String getLibraryName(String libName) { - String dir = currentFold; - String libPrefix = ""; - String libExtension = EXTERNAL_WIN; - - if (!dir.contains("win")) { - libPrefix = "lib"; - if (dir.contains("linux")) { - libExtension = EXTERNAL_LINUX; - } else { - // libExtension=".dylib"; - libExtension = EXTERNAL_MAC; - } - } - libName = dynamicParseUtil.compareLibName(currentFold, libName); - // 鍔ㄦ�佸簱浠ib寮�澶达紝鍒欎笉娣诲姞lib鍓嶇紑 - // 浠ib寮�澶寸殑搴撳垯涓嶆坊鍔爈ib鍓嶇紑 - return (libName.startsWith("lib") ? "" : libPrefix) + libName + libExtension; - } - - // 鑾峰彇绯荤粺瀵瑰簲鐨勫姩鎬佸簱鏂囦欢澶� - private static String getLibraryFold() { - String osType; - String osName = System.getProperty("os.name"); - if (osName.toLowerCase().startsWith("linux")) { - osType = ARCH_LINUX; - } else if (osName.toLowerCase().startsWith("mac") - || osName.toLowerCase().startsWith("darwin")) { - osType = ARCH_MAC; - } else if (osName.toLowerCase().startsWith("windows")) { - osType = ARCH_WINDOWS; - } else { - osType = ""; - } - String arch = System.getProperty("os.arch"); - arch = arch.toLowerCase().trim(); - if ("i386".equals(arch) || "i686".equals(arch)||"x86".equals(arch)) { - arch = PREFIX_32 + ""; - } else if ("x86_64".equals(arch) || "amd64".equals(arch)) { - arch = PREFIX_64 + ""; - } else if (arch.startsWith("arm")) { - arch = PREFIX_ARM + ""; - } - return osType + arch; - } -} +package com.ruoyi.device.dhsdk.lib; + +import com.ruoyi.device.dhsdk.lib.DynamicParseUtil; +import lombok.extern.slf4j.Slf4j; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.*; + +/** + * @author 47081 + * @version 1.0 + * @description 鍔ㄦ�佸簱鍔犺浇 + * @date 2020/11/14 + */ +@Slf4j(topic = "dhSdk") +public class LibraryLoad { + private static final String ARCH_WINDOWS = "win"; + private static final String ARCH_LINUX = "linux"; + private static final String ARCH_MAC = "mac"; + private static final int PREFIX_64 = 64; + private static final int PREFIX_32 = 32; + private static final String PREFIX_ARM = "ARM"; + private static final String EXTERNAL_WIN = ".dll"; + private static final String EXTERNAL_LINUX = ".so"; + private static final String EXTERNAL_MAC = ".dylib"; + private static DynamicParseUtil dynamicParseUtil; + /** 褰撳墠璇诲彇鐨勭洰褰� */ + private static String currentFold; + /** 鍔ㄦ�佸簱闇�瑕佸啓鍏ョ殑鐩綍 */ + private static String EXTRACT_PATH = System.getProperty("java.io.tmpdir"); + + private static boolean written = false; + + /** + * 璁剧疆鍔ㄦ�佸簱鍐欏叆鐨勮矾寰�,閫傜敤浜庨渶瑕佽嚜瀹氫箟鍔犺浇璺緞鐨勭敤鎴� + * + * @param path 鍔ㄦ�佸簱鍐欏叆鐨勬枃浠跺す,浠庤鏂囦欢澶逛笅鍔犺浇sdk鐨勫姩鎬佸簱 + */ + public static void setExtractPath(String path) { + EXTRACT_PATH = path; + } + + public static String getExtractPath() { + return EXTRACT_PATH; + + } + /** 鍔ㄦ�佸簱璺緞 */ + private static String INNER_PATH; + + // private static final String EXTERNAL_MAC = ".so"; + + private static String extractNetSDKLib(String libName) { + return extractLibrary(libName); + } + + public static String getLoadLibrary(String libraryName) { + currentFold = getLibraryFold(); + if (dynamicParseUtil == null) { + try { + dynamicParseUtil = + new DynamicParseUtil( + LibraryLoad.class.getClassLoader().getResourceAsStream("dynamic-lib-load.xml")); + if (!written) { + for (String libName : dynamicParseUtil.getLibsSystem(currentFold)) { + extractLibrary(libName); + } + written = true; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + String fullName = getLibraryName(libraryName); + String path = EXTRACT_PATH; + if (!(EXTRACT_PATH.endsWith("/") || EXTRACT_PATH.endsWith("\\"))) { + path = EXTRACT_PATH + "/"; + } + log.debug("load library: " + path + fullName); + return path + fullName; + } + + /** + * 灏唈ar鍖呴噷鐨勫姩鎬佸簱鍐欏叆鍒扮郴缁熺紦瀛樼洰褰�,浣跨敤缁濆璺緞鍔犺浇鍔ㄦ�佸簱 + * + * @param libName + * @return + */ + private static String extractLibrary(String libName) { + return extractLibrary("/lib", libName); + } + + /** + * 鐩稿璺緞鏂囦欢澶� + * + * @param relativePath 鐩稿璺緞 + * @param libName 鍔ㄦ�佸簱璺緞 + * @return + */ + private static String extractLibrary(String relativePath, String libName) { + if (libName.trim().equals("")) { + return ""; + } + String libFullName = getLibraryName(libName); + String dir = getLibraryFold(); + if (!(relativePath.endsWith("/") || relativePath.endsWith("\\"))) { + relativePath = relativePath + "/"; + } + String fileName = relativePath + dir + "/" + libFullName; + InputStream in = LibraryLoad.class.getResourceAsStream(fileName); + BufferedInputStream reader; + FileOutputStream writer; + File extractedLibFile = null; + try { + if (in == null) { + in = new FileInputStream(fileName); + } + String nativeTempDir = EXTRACT_PATH; + if (!(nativeTempDir.endsWith("/") || nativeTempDir.endsWith("\\"))) { + nativeTempDir = nativeTempDir + "/"; + } + extractedLibFile = new File(nativeTempDir + libFullName); + reader = new BufferedInputStream(in); + + // 妫�鏌ユ枃浠跺す鏄惁瀛樺湪锛屽鏋滀笉瀛樺湪鍒欏垱寤� + File parentDir = extractedLibFile.getParentFile(); + if (!parentDir.exists()) { + parentDir.mkdirs(); + } + + writer = new FileOutputStream(extractedLibFile); + byte[] buffer = new byte[1024]; + while (true) { + int len = reader.read(buffer); + if (len == 0 || len == -1) break; + writer.write(buffer, 0, len); + } + reader.close(); + writer.close(); + in.close(); + } catch (Exception e) { + log.error("dynamic file[ " + fileName + " ] not found in project.please ensure you need this library."); + } + return extractedLibFile != null ? extractedLibFile.getAbsolutePath() : ""; + } + + /** + * 鑾峰彇鍔ㄦ�佸簱瀹屾暣鍚嶇О + * + * @param libName + * @return + */ + private static String getLibraryName(String libName) { + String dir = currentFold; + String libPrefix = ""; + String libExtension = EXTERNAL_WIN; + + if (!dir.contains("win")) { + libPrefix = "lib"; + if (dir.contains("linux")) { + libExtension = EXTERNAL_LINUX; + } else { + // libExtension=".dylib"; + libExtension = EXTERNAL_MAC; + } + } + libName = dynamicParseUtil.compareLibName(currentFold, libName); + // 鍔ㄦ�佸簱浠ib寮�澶达紝鍒欎笉娣诲姞lib鍓嶇紑 + // 浠ib寮�澶寸殑搴撳垯涓嶆坊鍔爈ib鍓嶇紑 + return (libName.startsWith("lib") ? "" : libPrefix) + libName + libExtension; + } + + // 鑾峰彇绯荤粺瀵瑰簲鐨勫姩鎬佸簱鏂囦欢澶� + private static String getLibraryFold() { + String osType; + String osName = System.getProperty("os.name"); + if (osName.toLowerCase().startsWith("linux")) { + osType = ARCH_LINUX; + } else if (osName.toLowerCase().startsWith("mac") + || osName.toLowerCase().startsWith("darwin")) { + osType = ARCH_MAC; + } else if (osName.toLowerCase().startsWith("windows")) { + osType = ARCH_WINDOWS; + } else { + osType = ""; + } + String arch = System.getProperty("os.arch"); + arch = arch.toLowerCase().trim(); + if ("i386".equals(arch) || "i686".equals(arch)||"x86".equals(arch)) { + arch = PREFIX_32 + ""; + } else if ("x86_64".equals(arch) || "amd64".equals(arch)) { + arch = PREFIX_64 + ""; + } else if (arch.startsWith("arm")) { + arch = PREFIX_ARM + ""; + } + return osType + arch; + } +} -- Gitblit v1.9.3