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

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数据类型对照表

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));
    }
}

输出结果:

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

如果出现下面的错误:

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

猜你喜欢

转载自www.cnblogs.com/xiangjinpeng/p/10275660.html