美文网首页
Java使用JNA方式调用DLL(动态链接库)(原创,装载请注明

Java使用JNA方式调用DLL(动态链接库)(原创,装载请注明

作者: 小项01 | 来源:发表于2019-01-16 10:48 被阅读0次

    Java使用JNA调用DLL

    1.准备

    1.JDK环境
    2.Eclipse
    3.JNA包
    下载JNA包:
    (1).JNA的Github:https://github.com/java-native-access/jna
    (2).下载JNA包:
    https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna/4.0.0/jna-4.0.0.jar
    https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna-platform/4.0.0/jna-platform-4.0.0.jar
    4.需要调用的DLL(注意JDK版本位数要与DLL一致)
    本文使用的DLL下载:
    Dll2x86.dll:https://github.com/XiangJinPeng/NetworkFileStorage/raw/master/ProgrammingLanguage/C%20and%20C/Dynamic%20Link%20Library%20and%20Static%20Link%20Library/Files/Dll2x86.dll
    Dll2x64.dll:https://github.com/XiangJinPeng/NetworkFileStorage/raw/master/ProgrammingLanguage/C%20and%20C/Dynamic%20Link%20Library%20and%20Static%20Link%20Library/Files/Dll2x64.dll
    Dll2的编写请参考我的另一篇博客:https://www.cnblogs.com/xiangjinpeng/p/10192888.html

    2.Java和C的数据类型对照表

    Java中的数据类型和C中的数据类型声明关键字有所不同,在java代码中需要使用Java类型来代替C类型,下表为Java类型和C类型对照表。

    Java数据类型与C数据类型对照表

    table.png

    3.编写调用系统DLL的Java代码

    1.在Eclipse中新建Java工程
    2.把jna-4.0.0.jar加入到工程的库中
    3.新建Java类HelloWorld并输入如下代码

    //导包
    import com.sun.jna.Library;
    import com.sun.jna.Native;
    import com.sun.jna.Platform;
     
    public class HelloWorld {
        /*需要定义一个接口,继承自Library 或StdCallLibrary。
          默认的是继承Library ,如果动态链接库里的函数是以stdcall方式输出的,那么就继承StdCallLibrary,比如kernel32库。
        */
        public interface CLibrary extends Library {
            //加载msvcrt.dll库,此处不需要后缀.dll或.so
            CLibrary INSTANCE = (CLibrary)
                Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
                                   CLibrary.class);
            //对msvcrt.dll中需要使用的printf函数进行声明
            void printf(String format, Object... args);
        }
     
        public static void main(String[] args) {
            //使用printf函数
            CLibrary.INSTANCE.printf("Hello, World\n");
            for (int i=0;i < args.length;i++) {
                CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
            }
        }
    }
    

    运行程序,如果没有带参数则只打印出“Hello, World”,如果带了参数,则会打印出所有的参数。

    4.编写调用自己创建的DLL的代码

    1.新建Java工程
    2.把jna-4.0.0.jar加入到工程的库中
    3.把需要使用的dll文件放入到java工程目录下的bin目录下
    4.新建java类TestDll并输入如下代码:

    
    import com.sun.jna.Library;
    import com.sun.jna.Native;
    import com.sun.jna.Platform;
    public class TestDll {
        public interface CLibrary extends Library{
            //此处我的jdk版本为64位,故加载64位的Dll
            CLibrary INSTANCE = (CLibrary)Native.loadLibrary("Dll2x64",CLibrary.class);
            //Dll2x64中定义的函数
            double Add(double a,double b);
        }
        
        public static void main(String[] args) {
            System.out.println("3+4=Add(3,4)="+CLibrary.INSTANCE.Add(3,4));
        }
    }
    

    输出结果:


    image

    5.出现Exception in thread "main" java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序,错误的解决办法。

    如果出现下面的错误:


    error.png

    是因为jdk的位数与dll的位数不一致,换成一致的便可。

    喜欢请关注一下呦~~~

    CSDN:https://blog.csdn.net/qq_43210043
    简书:https://www.jianshu.com/u/27a54a63587e
    博客园:https://www.cnblogs.com/xiangjinpeng/
    Github:https://github.com/XiangJinPeng

    相关文章

      网友评论

          本文标题:Java使用JNA方式调用DLL(动态链接库)(原创,装载请注明

          本文链接:https://www.haomeiwen.com/subject/dwipdqtx.html