• 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:WindowsSystem32msvcrt.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!
    ");
            CLibrary.INSTANCE.printf("Hello, World
    ");
        }
    }

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

  • 相关阅读:
    安卓开发笔记——Broadcast广播机制(实现自定义小闹钟)
    安卓开发笔记——ListView加载性能优化ViewHolder
    安卓智能聊天机器人开发(二)
    安卓智能聊天机器人开发(一)
    基于Tcp协议的简单Socket通信实例(JAVA)
    Gson简要使用笔记
    JAVA的String 类【转】
    Oracle EBS R12 客户表结构
    EBS登陆界面个性化
    EBS取Web字段SQL操作文档
  • 原文地址:https://www.cnblogs.com/new-life/p/9345840.html
Copyright © 2020-2023  润新知