springboot使用jna调用dll

阅读数:334 评论数: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

POM依赖 &lt;dependency&gt; &lt;groupId&g

一、概述 @EnableConfigurationProperties注解的作用是:让使用了@ConfigurationProperties注解的类生效,并且将该类注入到IOC容器中,交由IOC容器进

一、概述 Druid(德鲁伊)是Java语言中的数据库连接池,Spring Boot 2.x默认使用Hikari数据源,虽然HikariCP的速度稍快,但是,Druid能够提供强大的监控和扩展功能。

1、配置文件的格式 springboot可以识别两种格式的配置文件,分别是yml文件与properties文件,我们可以将application.properties文件换成a