SpringBoot integra el SDK del dispositivo de red Haikang

Introducción al SDK

descripción general

El SDK de red del dispositivo se desarrolla sobre la base del protocolo de comunicación de red privada del dispositivo. Es un módulo de soporte para grabadoras de video de disco duro de red integradas, NVR, cámaras de red, cámaras de bola de red, servidores de video, decodificadores, hosts de alarma, almacenamiento de red y otros productos. Se utiliza para el desarrollo secundario remoto de software de dispositivos de acceso y control.

Función

Vista previa de imágenes, reproducción y descarga de archivos, control PTZ, armado/desarmado, intercomunicador de voz, administración de registros, tarjeta de decodificación, actualización remota, reinicio/apagado remotos, formateo del disco duro, configuración de parámetros (configuración del sistema, configuración de canales, configuración de puerto serial, alarma configuración, configuración de usuario), decodificador multicanal, función de dispositivo inteligente y conjunto de capacidades del dispositivo de adquisición, etc.

descargar

Plataforma abierta Hikvision

guía de acoplamiento

Tome java como ejemplo

Dado que el SDK de red del dispositivo proporcionado por nuestra empresa es una biblioteca de enlace dinámico empaquetada (Windows dll o Linux), se conectan varios lenguajes de desarrollo al SDK cargando el enlace de la biblioteca dinámica y llamando a la interfaz en la biblioteca dinámica para realizar el módulo de función conexión Por lo tanto, el acoplamiento de la red del dispositivo SDK no distingue entre los lenguajes de desarrollo, y el proceso de acoplamiento y las interfaces correspondientes son comunes, y los métodos para llamar a bibliotecas dinámicas en diferentes idiomas son diferentes. Este artículo se centra en cómo el lenguaje de desarrollo Java se conecta al SDK de la red del dispositivo. En la actualidad, la demostración desarrollada por el lenguaje Java proporcionado por nuestra empresa llama a la interfaz en la biblioteca de enlaces dinámicos a través de JNA.El marco JNA (Java Native Access) es un marco Java de código abierto desarrollado por SUN Company, y es un marco basado en JNI. , el marco JNA proporciona un conjunto de clases de herramientas Java para acceder dinámicamente a la biblioteca de enlaces dinámicos (biblioteca nativa: como dll de Windows, Linux) durante el tiempo de ejecución, y realizar la interfaz para llamar al paquete de lenguaje C/C++ en el Java, el personal de desarrollo de Java solo necesita describir la función y la estructura de la biblioteca nativa de destino en una interfaz de Java, y JNA realizará automáticamente la asignación de la interfaz de Java a la función nativa sin escribir ningún código nativo/JNI, lo que reduce en gran medida la dificultad de desarrollo de Java llamando a la biblioteca de enlaces dinámicos. En comparación con el método JNI, JNA simplifica enormemente el proceso de llamar a los métodos locales. Es muy conveniente de usar y básicamente se puede completar sin salir del entorno Java. El proceso de JNA llamando a C/C++ es más o menos como sigue:

integrado

Tomando  SpringBoot el proyecto como ejemplo, la versión Haikang SDK es 6.1.9.47, la versión JNA es 3.0.9 y está desarrollado usando Intellij IDEA 2022.2.3 en el entorno de Windows.

Inicializar el proyecto

  • Nuevo proyecto SpringBoot, versión 2.5.3
  • Agregar dependencias pom: jna, fastjson2

<dependency>
        <groupId>com.sun.jna</groupId>
        <artifactId>jna</artifactId>
        <version>3.0.9</version>
</dependency>


<dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2</artifactId>
        <version>2.0.20</version>
</dependency>          


  • Coloque el SDK de Hikvision descargado en el directorio del proyecto y cree las carpetas correspondientes según los diferentes sistemas operativos.
  • Si HCNetSDK.NET_DVR_PREVIEWINFO.HWND no puede encontrar la referencia, puede hacer lo siguiente: 1: importar ejemplos.jar en el código de muestra oficial en ProjectStructure; 2: cambiar el tipo HWND a int

  • establecer un puerto favorito server.port

Inicializar el SDK

Descripción general de la inicialización del SDK

En general, esperamos inicializar el sdk cuando se inicia el programa.

  • Esto se utiliza  ApplicationRunner como la entrada de inicialización.Cuando el programa se inicia con éxito, el Runner se ejecutará para la inicialización.
  • Para evitar el impacto de inicializar el sdk en el subproceso principal,  ApplicationRunner debe colocarse en el grupo de subprocesos  ThreadPoolExecutory agregar el procesamiento try-catch
  • HCNetSDK es un objeto provisto en el código de muestra SDK.Este objeto hereda Library y es responsable de interactuar con la biblioteca C/C++ de nivel inferior (el nivel inferior puede estar escrito en C, no estoy seguro aquí), es decir, para ejecutar Native llamadas Complete la importación de la biblioteca dependiente de sdk instanciando este objeto y utilícelo para enviar instrucciones a la cámara en el desarrollo comercial posterior.
  • Involucrando las diferencias de múltiples plataformas de sistemas operativos, el oficial proporciona diferentes bibliotecas dependientes de SDK, que incluyen específicamente: win32, win64, linux32, linux64, etc., por lo que al inicializar el SDK, debe cargar diferentes archivos de biblioteca dependientes de acuerdo con el entorno actual. .
  • Los archivos de biblioteca dependientes mencionados anteriormente son archivos de sufijo dll en Windows y, por lo tanto, archivos de sufijo en Linux
  • La ejecución real de la inicialización consiste en llamar a  hCNetSDK.NET_DVR_Init() este método, y el valor de retorno  true o  false se puede utilizar para juzgar si la inicialización es exitosa.

Nuevo ejecutor de aplicaciones

  • AppRunner necesita implementar la interfaz de ApplicationRunner y poner
    AppRunner como un componente en el contenedor de Spring para la administración
  • Inyecte SdkInitService en AppRunner y llame al método initSdk de SdkInitService en el método de ejecución para realizar la inicialización del SDK.

package com.ramble.hikvisionsdkintegration;
import com.ramble.hikvisionsdkintegration.service.SdkInitService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class AppRunner  implements ApplicationRunner {
    @Autowired
    private SdkInitService hksdkInitService;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        hksdkInitService.initSdk();
    }
}


Nuevo SdkInitService

  • Defina un atributo hCNetSDK público, el tipo es HCNetSDK e inicialice el valor del atributo hCNetSDK en el constructor. Este valor debe ser globalmente único. Aquí, nos referimos al código oficial para realizar el procesamiento de singleton. HCNetSDK es una interfaz proporcionada por el gobierno. Generalmente, se copia directamente al código fuente del proyecto. Verá que todas las interacciones con el dispositivo se completan a través de esta interfaz.
  • Una clase de devolución de llamada de excepción se define internamente para manejar el manejo global de excepciones al interactuar con el dispositivo
  • Inyecte el ejecutor ThreadPoolExecutor y la inicialización real se realizará en el subproceso secundario
  • Defina el método initSdk para realizar la inicialización
  • Debe tenerse en cuenta que el valor de inicialización para la propiedad hCNetSDK en el constructor es solo para cargar el SDK requerido 依赖库文件 en el tiempo de ejecución, y realmente no hace el trabajo de inicializar el SDK.
  • Debe concentrarse en el código en OSUtils. El requisito previo para cargar archivos de biblioteca dependientes es encontrar el archivo de biblioteca correspondiente. La operación se administra  getLoadLibrary en el método. El código escrito aquí debe corresponder al método de implementación seleccionado durante la implementación; de lo contrario, puede aparecer en windows El desarrollo es normal en linux, pero se reporta una excepción cuando se implementa en linux

SdkInitService:


package com.ramble.hikvisionsdkintegration.service;
import com.ramble.hikvisionsdkintegration.sdklib.HCNetSDK;
import com.ramble.hikvisionsdkintegration.task.InitSdkTask;
import com.ramble.hikvisionsdkintegration.util.OSUtils;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.concurrent.ThreadPoolExecutor;

@Slf4j
@Component
public class SdkInitService {
    public static HCNetSDK hCNetSDK = null;
    static FExceptionCallBack_Imp fExceptionCallBack;
    static class FExceptionCallBack_Imp implements HCNetSDK.FExceptionCallBack {
        public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) {
            System.out.println("异常事件类型:" + dwType);
            return;
        }
    }
    public SdkInitService() {
        if (hCNetSDK == null) {
            synchronized (HCNetSDK.class) {
                try {
                    hCNetSDK = (HCNetSDK) Native.loadLibrary(OSUtils.getLoadLibrary(), HCNetSDK.class);
                } catch (Exception ex) {
                    log.error("SdkInitService-init-hCNetSDK-error");
                }
            }
        }
    }
    @Autowired
    private ThreadPoolExecutor executor;
    public void initSdk() {
        log.info("HKSDKInitService-init-coming");
        executor.execute(new InitSdkTask());
    }
}

OSUtils:


package com.ramble.hikvisionsdkintegration.util;
import com.sun.jna.Platform;
import lombok.extern.slf4j.Slf4j;
import java.io.File;

@Slf4j
public class OSUtils {
    // 获取操作平台信息
    public static String getOsPrefix() {
        String arch = System.getProperty("os.arch").toLowerCase();
        final String name = System.getProperty("os.name");
        String osPrefix;
        if (Platform.isWindows()) {
            if ("i386".equals(arch)) {
                arch = "x86";
            }
            osPrefix = "win32-" + arch;
        } else if (Platform.isLinux()) {
            if ("x86".equals(arch)) {
                arch = "i386";
            } else if ("x86_64".equals(arch)) {
                arch = "amd64";
            }
            osPrefix = "linux-" + arch;
        } else {
            osPrefix = name.toLowerCase();
            if ("x86".equals(arch)) {
                arch = "i386";
            }
            if ("x86_64".equals(arch)) {
                arch = "amd64";
            }
            int space = osPrefix.indexOf(" ");
            if (space != -1) {
                osPrefix = osPrefix.substring(0, space);
            }
            osPrefix += "-" + arch;
        }
        return osPrefix;
    }
    public static String getOsName() {
        String osName = "";
        String osPrefix = getOsPrefix();
        if (osPrefix.toLowerCase().startsWith("win32-x86")
                || osPrefix.toLowerCase().startsWith("win32-amd64")) {
            osName = "win";
        } else if (osPrefix.toLowerCase().startsWith("linux-i386")
                || osPrefix.toLowerCase().startsWith("linux-amd64")) {
            osName = "linux";
        }
        return osName;
    }
    /**
     * 获取库文件
     * 区分win、linux
     *
     * @return
     */
    public static String getLoadLibrary() {
        if (isChecking()) {
            return null;
        }
        String userDir = System.getProperty("user.dir");
        log.info("getLoadLibrary-userDir={}", userDir);
        String loadLibrary = "";
        String library = "";
        String osPrefix = getOsPrefix();
        if (osPrefix.toLowerCase().startsWith("win32-x86")) {
            loadLibrary = System.getProperty("user.dir") + File.separator + "sdk" + File.separator + "hklibwin32" + File.separator;
            library = "HCNetSDK.dll";
        } else if (osPrefix.toLowerCase().startsWith("win32-amd64")) {
            loadLibrary = System.getProperty("user.dir") + File.separator + "sdk" + File.separator + "hklibwin64" + File.separator;
            library = "HCNetSDK.dll";
        } else if (osPrefix.toLowerCase().startsWith("linux-i386")) {
            //同 linux-amd64
            loadLibrary = "";
            library = "libhcnetsdk.so";
        } else if (osPrefix.toLowerCase().startsWith("linux-amd64")) {
            //方式一:使用系统默认的加载库路径,在系统的/usr/lib文件中加入你Java工程所需要使用的so文件,然后将HCNetSDKCom文件夹下的组件库也复制到/usr/lib目录,HCNetSDKCom文件夹中的组件库不要随意更换路径。CentOS 64位需拷贝到/usr/lib64下。
            //针对方式一,前缀就是绝对路径
            //loadLibrary = "/usr/lib64/lib/hkliblinux64/";
            //方式二:配置LD_LIBRARY_PATH环境变量加载库文件;配置/etc/ld.so.conf,加上你自己的Java工程所需要的so文件的路径
            //针对方式二,无需添加前缀,程序会从linux系统的so共享库中查找libhcnetsdk.so
            loadLibrary = "";
            library = "libhcnetsdk.so";
        }
        log.info("================= Load library Path :{} ==================", loadLibrary + library);
        return loadLibrary + library;
    }
    private static boolean checking = false;
    public static void setChecking() {
        checking = true;
    }
    public static void clearChecking() {
        checking = false;
    }
    public static boolean isChecking() {
        return checking;
    }
}


Nueva InitSdkTask

  • Esta clase implementa la interfaz Runnable y anula el método de ejecución.
  • Cree un nuevo atributo privado hCNetSDK y asígnelo como SdkInitService.hCNetSDK. Debido a que la inicialización necesita usar el objeto HCNetSDK para interactuar con el dispositivo, debe asegurarse de que este objeto se haya creado antes de la inicialización. En este ejemplo, el programa inicializa el Objeto HCNetSDK al ejecutar el constructor SdkInitService y colocarlo en una variable estática global
  • De hecho, también es posible no crear una nueva propiedad privada hCNetSDK y usar SdkInitService.hCNetSDK para obtener este objeto donde se necesita.
  • La inicialización se realiza llamando al método hCNetSDK.NET_DVR_Init, y el valor devuelto se puede usar para determinar si la inicialización es exitosa.Después de que la inicialización sea exitosa, se puede llamar a la interfaz de servicio para enviar instrucciones al dispositivo.
  • NET_DVR_SetConnectTime, NET_DVR_SetReconnect son opcionales y no afectarán la inicialización del propio SDK.
  • Para evitar que el programa principal se vea afectado, el código de inicialización deberá realizar el procesamiento try-catch.

InitSdkTarea:


package com.ramble.hikvisionsdkintegration.task;
import com.ramble.hikvisionsdkintegration.sdklib.HCNetSDK;
import com.ramble.hikvisionsdkintegration.service.SdkInitService;
import com.ramble.hikvisionsdkintegration.util.OSUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.Objects;

@Slf4j
public class InitSdkTask implements Runnable {
    /**
     * 装配 sdk 所需依赖
     */
    private static HCNetSDK hCNetSDK = SdkInitService.hCNetSDK;
    @Override
    public void run() {
        try {
            if (Objects.equals(OSUtils.getOsName(), "linux")) {
                log.info("InitSdk-is-linux");
                String userDir = System.getProperty("user.dir");
                log.info("InitSdk-userDir={}", userDir);
                String osPrefix = OSUtils.getOsPrefix();
                if (osPrefix.toLowerCase().startsWith("linux-i386")) {
                    HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
                    HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
                    //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
                    //linux 下, 库加载参考:OSUtils.getLoadLibrary()
                    String strPath1 = System.getProperty("user.dir") + "/hkliblinux32/libcrypto.so.1.1";
                    String strPath2 = System.getProperty("user.dir") + "/hkliblinux32/libssl.so.1.1";
                    System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
                    ptrByteArray1.write();
                    hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer());
                    System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
                    ptrByteArray2.write();
                    hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer());
                    //linux 下, 库加载参考:OSUtils.getLoadLibrary()
                    String strPathCom = System.getProperty("user.dir") + "/hkliblinux32/HCNetSDKCom/";
                    HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
                    System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
                    struComPath.write();
                    hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
                } else if (osPrefix.toLowerCase().startsWith("linux-amd64")) {
                    HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
                    HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
                    //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
                    //linux 下, 库加载参考:OSUtils.getLoadLibrary()
                    String strPath1 = System.getProperty("user.dir") + "/hkliblinux64/libcrypto.so.1.1";
                    String strPath2 = System.getProperty("user.dir") + "/hkliblinux64/libssl.so.1.1";
                    System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
                    ptrByteArray1.write();
                    hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer());
                    System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
                    ptrByteArray2.write();
                    hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer());
                    String strPathCom = System.getProperty("user.dir") + "/hkliblinux64/HCNetSDKCom/";
                    //linux 下, 库加载参考:OSUtils.getLoadLibrary()
                    HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
                    System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
                    struComPath.write();
                    hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
                } else {
                    log.info("osPrefix={}", osPrefix);
                }
            }
            //初始化sdk
            boolean isOk = hCNetSDK.NET_DVR_Init();
            hCNetSDK.NET_DVR_SetConnectTime(10, 1);
            hCNetSDK.NET_DVR_SetReconnect(100, true);
            if (!isOk) {
                log.error("=================== InitSDK init fail ===================");
            } else {
                log.info("============== InitSDK init success ====================");
            }
        } catch (Exception e) {
            log.error("InitSDK-error,e={}", e.getMessage());
            e.printStackTrace();
        }
    }
}


Nuevo HCNetSDK

Simplemente cópielo directamente desde el código de muestra oficial

interfaz comercial de llamadas

  • Cree un nuevo controlador e intente llamar a la interfaz para obtener el estado del SDK.
  • Debe iniciar sesión antes de llamar a todas las interfaces comerciales

package com.ramble.hikvisionsdkintegration.controller;
import com.alibaba.fastjson2.JSON;
import com.ramble.hikvisionsdkintegration.dto.GlobalResponseEntity;
import com.ramble.hikvisionsdkintegration.sdklib.HCNetSDK;
import com.ramble.hikvisionsdkintegration.service.SdkInitService;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("/test")
public class TestController {
    private static String m_sDeviceIP = "192.168.1.142";
    private static String m_sUsername = "xxx";
    private static String m_sPassword = "xxx";
    
    /**
     * 获取sdk状态
     *
     * @return {@link GlobalResponseEntity}<{@link String}>
     * 返回值举例:{"success":true,"code":"000000","message":"request successfully",
     * "data":"{\"dwRes\":[0,0,0,0,0,0,0,0,0,0],\"dwTotalAlarmChanNum\":0,\"dwTotalBroadCastNum\":0,\"dwTotalFileSearchNum\":0,\"dwTotalFormatNum\":0,
     * \"dwTotalLogSearchNum\":0,\"dwTotalLoginNum\":1,\"dwTotalPlayBackNum\":0,\"dwTotalRealPlayNum\":0,\"dwTotalSerialNum\":0,\"dwTotalUpgradeNum\":0,
     * \"dwTotalVoiceComNum\":0,\"autoRead\":true,\"autoWrite\":true,\"pointer\":{\"size\":84,\"valid\":true}}"}
     */
     
    @GetMapping("/state")
    public GlobalResponseEntity<String> getSdkState() {
        //登录
        Integer userId = login();
        log.info("userId={}", userId);
        HCNetSDK.NET_DVR_SDKSTATE sdkState = new HCNetSDK.NET_DVR_SDKSTATE();
        //获取当前SDK状态信息
        boolean result = SdkInitService.hCNetSDK.NET_DVR_GetSDKState(sdkState);
        if (result) {
            sdkState.read();
            String s = JSON.toJSONString(sdkState);
            return GlobalResponseEntity.success(s);
        } else {
            int error = SdkInitService.hCNetSDK.NET_DVR_GetLastError();
            return GlobalResponseEntity.error("获取失败,错误码为:" + error);
        }
    }
    
    
    private Integer login() {
        HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息
        m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
        System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
        m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
        System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
        m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
        System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
        m_strLoginInfo.wPort = Short.valueOf("8000");
        m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
        m_strLoginInfo.write();
        HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
        int loginHandler = SdkInitService.hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
        if (loginHandler == -1) {
            int errorCode = SdkInitService.hCNetSDK.NET_DVR_GetLastError();
            IntByReference errorInt = new IntByReference(errorCode);
            log.error("[HK] login fail errorCode:{}, errMsg:{}", errorCode, SdkInitService.hCNetSDK.NET_DVR_GetErrorMsg(errorInt));
            return null;
        } else {
            return loginHandler;
        }
    }
}


desplegar

Copie el archivo de la biblioteca so en el directorio de implementación

Todas las versiones de los archivos de la biblioteca sdk de todos los fabricantes se mantienen en el código fuente del proyecto, y el archivo so del archivo de la biblioteca de Linux debe copiarse en el directorio raíz de implementación, que está al mismo nivel que el archivo jar.

añadir variable de entorno

Cargue el archivo de biblioteca configurando  LD_LIBRARY_PATH la variable de entorno, abra el  /etc/profile archivo de configuración del sistema y agregue el directorio donde se encuentra el archivo de biblioteca al final:


export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/app/jars/hkliblinux64:/home/app/jars/hkliblinux64/HCNetSDKCom

Como se muestra arriba:
● Agregue el directorio hkliblinux32 para 32 bits y agregue el directorio hkliblinux64 para 64 bits
● No olvide que el directorio HCNetSDKCom también debe configurarse, porque también contiene archivos de biblioteca.
Ejecute el comando fuente para que la configuración surta efecto:


source   /etc/profile

Agregue la ruta de carga de la biblioteca

Abra  /etc/ld.so.conf el archivo de configuración y agregue el directorio donde se encuentra el archivo de la biblioteca so


/home/app/jars/hkliblinux64
/home/app/jars/hkliblinux64/HCNetSDKCom

Como se muestra arriba:
● Para 32 bits, agregue el directorio hkliblinux32 y para 64 bits, agregue el directorio hkliblinux64.
● No olvide que el directorio HCNetSDKCom también debe configurarse, ya que también contiene archivos de biblioteca.

Ejecute el comando ldconfig para que la configuración surta efecto:


ldconfig

Verifique que la inicialización del SDK sea exitosa

En términos generales, puede agregar un registro cuando el programa inicializa el SDK y juzgar si la inicialización es exitosa a través de la salida del registro.

Supongo que te gusta

Origin blog.csdn.net/sinat_40572875/article/details/129758361
Recomendado
Clasificación