| | |
| | | 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; |
| | | } |
| | | |
| | | /** |
| | | * 将jar包里的动态库写入到系统缓存目录,使用绝对路径加载动态库 |
| | | * |
| | | * @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); |
| | | // 动态库以lib开头,则不添加lib前缀 |
| | | // 以lib开头的库则不添加lib前缀 |
| | | 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;
|
| | | }
|
| | |
|
| | | /**
|
| | | * 将jar包里的动态库写入到系统缓存目录,使用绝对路径加载动态库
|
| | | *
|
| | | * @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);
|
| | | // 动态库以lib开头,则不添加lib前缀
|
| | | // 以lib开头的库则不添加lib前缀
|
| | | 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;
|
| | | }
|
| | | }
|