Просмотр исходного кода

Merge branch 'dev' of ssh://10.10.100.21/source/smartschool-platform into dev

zhaoy 7 лет назад
Родитель
Сommit
1a909fd341

+ 13 - 0
applications/device/device-sdk-dahua/src/main/java/com/usoftchina/smartschool/device/dahua/config/DahuaProperties.java

@@ -20,6 +20,11 @@ public class DahuaProperties {
      */
     private int connectTime = 10000;
 
+    /**
+     * DLL资源路径
+     */
+    private String library;
+
     public int getWaitTime() {
         return waitTime;
     }
@@ -35,4 +40,12 @@ public class DahuaProperties {
     public void setConnectTime(int connectTime) {
         this.connectTime = connectTime;
     }
+
+    public String getLibrary() {
+        return library;
+    }
+
+    public void setLibrary(String library) {
+        this.library = library;
+    }
 }

+ 40 - 2
applications/device/device-sdk-dahua/src/main/java/com/usoftchina/smartschool/device/dahua/lib/DahuaSdk.java

@@ -11,9 +11,17 @@ import com.usoftchina.smartschool.device.event.DeviceDisconnectEvent;
 import com.usoftchina.smartschool.device.event.DeviceReconnectEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.util.StreamUtils;
+import org.springframework.util.StringUtils;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import java.io.File;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
 /**
  * @author yingp
@@ -31,10 +39,40 @@ public class DahuaSdk {
      */
     private int tryTimes = 1;
 
+    /**
+     * 拷贝DLL资源到临时目录,解决fat jar无法加载DLL问题
+     *
+     * @return
+     */
+    private String createTempLibraries() {
+        try {
+            String tempDir = Files.createTempDirectory("dahua-lib-").toFile().getCanonicalPath();
+            String manifest = StreamUtils.copyToString(
+                    new ClassPathResource(Platform.RESOURCE_PREFIX + File.separator + "manifest.txt").getInputStream(),
+                    Charset.defaultCharset());
+            String[] names = manifest.split(",");
+            for (String name : names) {
+                if (StringUtils.hasText(name)) {
+                    Path tempLib = Paths.get(tempDir, name);
+                    Files.copy(new ClassPathResource(Platform.RESOURCE_PREFIX + File.separator + name).getInputStream(),
+                            tempLib);
+                }
+            }
+            return tempDir;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return Platform.RESOURCE_PREFIX;
+    }
+
     public DahuaSdk(DahuaProperties properties) {
         this.properties = properties;
-        this.instance = Native.load(Platform.RESOURCE_PREFIX +
-                (Platform.isWindows() ? "/dhnetsdk" : "/libdhnetsdk"), DahuaLibrary.class);
+        String libDir = properties.getLibrary();
+        if (StringUtils.isEmpty(libDir)) {
+            libDir = createTempLibraries();
+        }
+        this.instance = Native.load(libDir + File.separator +
+                (Platform.isWindows() ? "dhnetsdk" : "libdhnetsdk"), DahuaLibrary.class);
     }
 
     public DahuaLibrary getInstance() {

+ 1 - 0
applications/device/device-sdk-dahua/src/main/resources/linux-amd64/manifest.txt

@@ -0,0 +1 @@
+libavnetsdk.so,libdhconfigsdk.so,libdhnetsdk.so,libInfra.so,libNetFramework.so,libStream.so,libStreamSvr.so

+ 1 - 0
applications/device/device-sdk-dahua/src/main/resources/win32-x86-64/manifest.txt

@@ -0,0 +1 @@
+aacdec.dll,adpcmdec.dll,amrdec.dll,armenc64.dll,avnetsdk.dll,dhconfigsdk.dll,dhconfigsdk.lib,dhnetsdk.dll,dhnetsdk.lib,dhplay.dll,fisheye.dll,g729dec.dll,g7221dec.dll,h26ldec.dll,h264dec.dll,hevcdec.dll,HWDec.dll,Infra.dll,IvsDrawer.dll,Json.dll,MCL_FPTZ.dll,mjpegdec.dll,mp2dec.dll,mp3dec.dll,mpeg4dec.dll,NetFramework.dll,postproc.dll,Stream.dll,StreamSvr.dll,svac_dec.dll,swscale.dll,VTHStack.dll