springboot使用jna调用dll
阅读数:362 评论数:0
跳转到新版页面分类
python/Java
正文
1、依赖
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.5.0</version>
</dependency>
2、存放dll路径
(1)可以放在项目中的resources目录下
(2)打成jar包后,路径
linux: /usr/lib/
win:所有DLL放同级目录
(3)或者通过java.library.path自定义路径
public boolean addDllLocationToPath(String dllLocation)
{
try
{
System.setProperty("java.library.path", System.getProperty("java.library.path") + ";" + dllLocation);
Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
fieldSysPath.setAccessible(true);
fieldSysPath.set(null, null);
}
catch (Exception e)
{
System.err.println("Could not modify path");
return false;
}
return true;
}
}
3、结构体映射
struct CodeData
{
unsigned char code[4096];
unsigned short codeLen;
unsigned char orgId[8];
unsigned short orgIdLen;
};
@Structure.FieldOrder({"code", "codeLen", "orgId", "orgIdLen"})
public static class CodeData extends Structure {
//二维码数据 4096,要和dll的大小一致
public byte[] code = new byte[4096];
// 二维码数据长度 4096
public short codeLen;
//机构id
public byte[] orgId;
//机构id长度8
public short orgIdLen;
//这个类代表结构体指针
public static class ByReference extends CodeData implements Structure.ByReference {
}
//这个类代表结构体本身
public static class ByValue extends CodeData implements Structure.ByValue {
}
}
注意事项:
(1)Structure子类中公共字段的顺序,必须与C语言中的结构的顺序一致。
(2)C语言结构中的char数组指定了大小,则使用byte需要指定大小。
(3)使用指针初始化时指定大小。
4、函数映射
unsigned char getData (struct CodeData *code,unsigned char *str,unsigned short len, unsigned char *data,unsigned short *dataLen);
/**
* 获取数据
*
* @param codeData 结构体指针入参
* @param str 字符串入参
* @param len 基础类型入参
* @param data 字符串出参
* @param dataLen 基础类型出参
* @return
*/
byte getData(CodeData.ByReference codeData,String str, short len, byte[] data, ShortByReference dataLen);
5、注意事项
(1)dll库如果是32位的,jdk也需要改成32位的。
(2)dll存在的依赖关系,先引入父级的依赖,具体如下:
依赖项:
public interface MklIntelThreadLibrary extends Library {
MklIntelThreadLibrary INSTANCE = Native.load("mkl_intel_thread", MklIntelThreadLibrary.class);
}
需要调用的dll
public interface AntiSpoofLibrary extends Library {
MklIntelThreadLibrary mkl = MklIntelThreadLibrary.INSTANCE;
AntiSpoofLibrary INSTANCE = Native.load("AntiSpoof", AntiSpoofLibrary.class);
/**
* 初始化接口,返回:true正确,false错误
*
* @return
*/
boolean InitSpoof(String modelPath);
/**
* 活体检测接口 ,返回:true 活体,false:假体
*
* @return
*/
boolean AntiSpoofBase64(String rgbBase, String irBase, boolean print);
}
(3)invalid memory access
可能原因:数据类型映射不对;不支持多线程,调用时需要使用同步代码块。
相关推荐
一、request uri部分 @PathVariable
获取路径参数,形如url/{id}
二、request header部分 @RequestHeade
一、概述
一个项目使用多个数据库(无论是主从复制--读写分离还是分布式数据库结构)的重要性变得越来越明显,整合的多数据源有两种方式:分包和aop。
1、SqlSessionTemplate
SqlSe
一、概述
PageHelper是开源免费的mybatis第三方分页插件。
二、使用
1、pom引入
<dependency>
<groupId>com.github.pageh
一、日志框架的介绍
Spring Boot 2.*默认采用slf4j+logback的形式,slf4j是个通用的日志门面,logback就是个具体的日志框架了。
一、问题解决方式
@PostMapping("/insert")
@ResponseBody
private ResultVO insert1(@RequestParam Map<String, St
JJWT 全称Java Json Web Token。
而JWT是一种在两方之间传输信息的方法,在jwt的主体中编码的信息被称为claims。jwt的扩展形式是json,因此每个c
一、概述
@EnableConfigurationProperties注解的作用是:让使用了@ConfigurationProperties注解的类生效,并且将该类注入到IOC容器中,交由IOC容器进
一、概述
Druid(德鲁伊)是Java语言中的数据库连接池,Spring Boot 2.x默认使用Hikari数据源,虽然HikariCP的速度稍快,但是,Druid能够提供强大的监控和扩展功能。
1、配置文件的格式
springboot可以识别两种格式的配置文件,分别是yml文件与properties文件,我们可以将application.properties文件换成a