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 and C/Dynamic Link Library and Static Link Library/Files/Dll2x86.dll

Dll2x64.dll:https://github.com/XiangJinPeng/NetworkFileStorage/raw/master/ProgrammingLanguage/C and C/Dynamic Link Library and Static Link Library/Files/Dll2x64.dll

Dll2的编写请参考我的另一篇博客:https://www.cnblogs.com/xiangjinpeng/p/10192888.html

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

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

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

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

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

输出结果:

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

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

如果出现下面的错误:

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

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

上一篇:Java使用JNA调用DLL库


下一篇:Java 通过Jna调用dll路径问题