Java中调用DLL库

元气小坏坏 提交于 2020-02-27 04:55:22

JNA的API文档: http://java-native-access.github.io/jna/5.5.0/javadoc/overview-summary.html#overview_description 其中有C代码及对应的JNA相应代码

还有一些帖子很不错:

1:Java JNA (三)—— 结构体使用及简单示例

2:jna对结构体、指针、引用、拷贝参数传递的使用

3:jna调用dll, 结构体方式调用 (简单demo)

4: Getting Started with JNA  https://github.com/java-native-access/jna/blob/master/www/GettingStarted.md

5:java调用动态库dll/so(二)jna结构体Structure介绍和使用

6: 使用JNA访问WindowsAPI操作Windows窗口元素 还有Github JNA官方example,包括各种例子

7: JAVA使用JNA技术获取键盘输入   jna test【鼠标 键盘钩子】

8: JNA Pointer结构体传递 有demo代码

9:JNA中关于int、float、double、char、byte等数组类型的类型映射

10:JNA int*等基本类型的映射关系

11:C ++中指针 void**、void*、char**、char*、int* 对应JAVA JNA类型映射关系及简单示例

12:JNA共享内存和动态数组指针

13:JNA的各种example分类在网页中,可以针对各种知识点看代码

14: JNA学习(C指针与JAVA的buffer/ARRAY学习代码 很不错)

15:Java 通过 JNA 调用 DLL 返回 char * 字符串乱码问题的解决

16: JNA释放Memory对象分配的内存

解决了springboot+javafx+mina+mybatis+AOP等问题之后,开始想到真正的项目中需要用java访问DLL,发现有三种方式:

1)JNI 

2)JNA

3)JNative

关于JNA的中文博客及资料:

具体介绍及用法如下(如果是c#写的DLL也能用吗???):

java使用JNA框架调用dll动态库

 

这两天了解了一下java调用dll动态库的方法,总的有三种:JNI、JNA、JNative。其中JNA调用DLL是最方便的。

·JNI

·JNA

·JNative

    java使用 JNI来调用dll动态库的调用,工作量略大,一般情况下开发人员会选用JNA或JNative。

使用JNative调用DLL除了要引入jar包外还需要额外引入一个dll文件,而JNA只需要引入jar即可使用。

使用JNA框架调用DLL动态库,步骤如下

1.导入JNA支持的jar包

添加jna-4.x.x.jar、jna-platform-4.x.x.jar到项目buildpath中(Maven项目可在中央仓库中搜索JNA的相关依赖添加到项目中)

2.代码调用DLL动态库方法

复制代码
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;

/**
 * JNA框架DLL动态库读取调用示例类
 * @ClassName: DllCall
 * @Description: 读取调用DLL动态库文件中的方法
 * @author: LinWenLi
 * @date: 2018年7月18日 上午10:32:16
 */
public class JNADllCall {
/**
     * DLL动态库调用方法
     * @Description: 读取调用CDecl方式导出的DLL动态库方法
     * @author: LinWenLi
     * @date: 2018年7月18日 上午10:49:02
     */
    public interface CLibrary extends Library {
        // DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径。(此处:(Platform.isWindows()?"msvcrt":"c")指本地动态库msvcrt.dll)
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
                CLibrary.class);

        // 声明将要调用的DLL中的方法,可以是多个方法(此处示例调用本地动态库msvcrt.dll中的printf()方法)
        void printf(String format, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World!");
    }
}
复制代码

注意:要调用的DLL位数要与JDK位数相同,否则无法调用。

郁闷的是,按照以上的官方测试代码运行后,控制台没有报错也没有打印出任何东西,在多次测试无果后我将C:\Windows\System32\msvcrt.dll复制到电脑桌面,再将代码中dll路径改为绝对路径,运行成功。

DLL的函数导出方式分为两种,其中StdCall方式导出的DLL,JNA的调用代码如下方的DLL动态库调用方法1,Decl方式导出的DLL,调用代码如DLL动态库调用方法2

复制代码
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;

/**
 * JNA框架DLL动态库读取调用示例类
 * 
 * @ClassName: DllCall
 * @Description: 读取调用DLL动态库文件中的方法
 * @author: LinWenLi
 * @date: 2018年7月18日 上午10:32:16
 */
public class JNADllCall {

    /**
     * DLL动态库调用方法1
     * 
     * @Description: 读取调用StdCall方式导出的DLL动态库方法
     * @author: LinWenLi
     * @date: 2018年7月18日 上午10:37:58
     */
    public interface StdCallDll extends StdCallLibrary {
        // DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径
        StdCallDll INSTANCE = (StdCallDll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
                StdCallDll.class);// 加载动态库文件
        // 声明将要调用的DLL中的方法(可以是多个方法)

        void printf(String format, Object... args);
    }

    /**
     * DLL动态库调用方法2
     * 
     * @Description: 读取调用Decl方式导出的DLL动态库方法
     * @author: LinWenLi
     * @date: 2018年7月18日 上午10:49:02
     */
    public interface CLibrary extends Library {
        // DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
                CLibrary.class);

        // 声明将要调用的DLL中的方法(可以是多个方法)
        void printf(String format, Object... args);
    }

    public static void main(String[] args) {
        StdCallDll.INSTANCE.printf("Hello, World!\n");
        CLibrary.INSTANCE.printf("Hello, World\n");
    }
}
复制代码

以上简单记录java通过JNA框架调用DLL动态库的步骤,若需要进一步了解可参考以下博文地址:https://www.cnblogs.com/lanxuezaipiao/p/3635556.html

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!