引入JNA所用的jar包
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.2.0</version>
</dependency>
然后在类中初始化jna所调用的dll库
public class HelloWorld {
public interface YH_FaceAIDLL extends Library {
//初始化dll库
YH_FaceAIDLL faceDll = (YH_FaceAIDLL) Native.loadLibrary(getYH_FaceAIDLL(), YH_FaceAIDLL.class);
//编写对应的函数
void printf(String format, Object... args);
}
public static void main(String[] args) {
YH_FaceAIDLL .faceDll .printf("Hello, World\n");
for (int i=0;i < args.length;i++) {
YH_FaceAIDLL.faceDll.printf("Argument %d: %s\n", i, args[i]);
}
}
}
JNA传递结构参数首先将对象继承Structrue成为一个结构类
/**
* 获取或设置设备参数的类 要继承 Structure 使其成为一个结构类
*/
public class PSTDeviceConfig extends Structure {
public int nLength; //数据缓存长度
public byte[] cBuffer; //数据内容
public static class ByReference extends PSTDeviceConfig implements Structure.ByReference {}
public static class ByValue extends PSTDeviceConfig implements Structure.ByValue {}
@Override
protected List getFieldOrder() {
return Arrays.asList(new String[]{"nLength", "cBuffer"});
}
}
package com.sds.webapi.controller;
import com.alibaba.fastjson.JSON;
import com.sds.webapi.entity.PSTDeviceConfig;
import com.sds.webapi.entity.User;
import com.sds.webapi.service.UserService;
import com.sds.webapi.tools.CallDLLUtil;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @Description: DeviceSetController
* @Author: Anhk丶
* @Date: 2020/7/31 9:30
* @Version: 1.0
*/
@Controller
@RequestMapping("/deviceSet")
public class DeviceSetController {
@Autowired
private UserService userService;
private final Logger log = Logger.getLogger(DeviceSetController.class);
/**
* 设备参数设置及获取
*
* @param deviceId 设备id
* @param param 命令参数
* @param token 登陆token
* @return 结果集
* @throws IOException IO异常
*/
@ResponseBody
@RequestMapping("/deviceConfig")
public String deviceSet(String deviceId, String param, String token) throws IOException {
int result_login, result_query, result_logout;
String MyIp, MyPort;
//返回结果的map集合
Map<String, Object> resultMap = new HashMap<>();
//获取服务器的IP和端口号
MyIp = DownloadConfigController.getProfileString("IP", "user server ip");
MyPort = DownloadConfigController.getProfileString("IP", "user server port");
// 根据token查询用户名和密码
User user = userService.queryUserBeanByToken(token);
//从登陆控制层(VerificationCodeController)中获取用户登陆时的明文密码
user.setPassword(VerificationCodeController.PWD);
try {
log.info("queryVersion Get DLL Path:" + CallDLLUtil.getYH_SDSsdkDLLPath());
//登陆dll库
result_login = CallDLLUtil.YH_Client_SDK_Dll.clientSDKDll.SDS_NetClientEx_Login(MyIp, Integer.parseInt(MyPort), user.getName(), user.getPassword(), 5000);
//查询数据
//1. 创建一个输入对象
PSTDeviceConfig pInCfg = new PSTDeviceConfig();
//如果有多个的话,可以使用Structure的toArray()方法来传递结构数组
//Structure[] structures = pInCfg.toArray(2);
//2. 得到输入参数的byte[]数组
byte[] bytes = param.getBytes();
//3. 得到byte数组的长度
pInCfg.nLength = bytes.length;
pInCfg.cBuffer = bytes;
//4. 创建一个输出对象用来接收返回体
PSTDeviceConfig pOutCfg = new PSTDeviceConfig();
pOutCfg.nLength = 0;
pOutCfg.cBuffer = new byte[3072];
result_query = CallDLLUtil.YH_Client_SDK_Dll.clientSDKDll.SDS_NetClient_TranConfig(deviceId, 0, pInCfg, pOutCfg);
//根据返回的数据长度,来获取它具体的内容
byte[] bytes1 = Arrays.copyOf(pOutCfg.cBuffer, pOutCfg.nLength);
//将得到的byte数组转换为String
String data = new String(bytes1);
log.info("设备" + deviceId + "的信息 -> " + data);
//退出dll库
result_logout = CallDLLUtil.YH_Client_SDK_Dll.clientSDKDll.SDS_NetClientEx_Logout();
log.info("HistoryVideo_LoginResult -> " + result_login);
log.info("HistoryVideo_QueryResult -> " + result_query);
log.info("HistoryVideo_LogoutResult -> " + result_logout);
if (result_login != 0) {
// 登陆失败
resultMap.put("status", "-2");
resultMap.put("data", "login error");
} else if (result_query == 0) {
if (result_logout == 0) {
// 获取成功并退出
resultMap.put("status", "1");
} else {
// 获取成功,但退出失败
resultMap.put("status", "0");
}
resultMap.put("data", data);
} else {
if (result_logout == 0) {
// 获取失败,退出成功
resultMap.put("status", "-1");
} else {
// 获取失败,退出失败
resultMap.put("result", "-3");
}
resultMap.put("data", "query failure");
}
return JSON.toJSONString(resultMap);
} catch (Exception e) {
log.error("queryError", e);
resultMap.put("status", "-4");
resultMap.put("data", "query error");
return JSON.toJSONString(resultMap);
}
}
}