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

本文详细介绍了如何使用Java的JNA库调用DLL,包括加载系统库msvcrt.dll和自定义库Dll2x64,展示了如何声明和使用函数,并提供了遇到错误"%1 不是有效的 Win32 应用程序"的解决方案,强调了JDK位数与DLL位数匹配的重要性。
摘要由CSDN通过智能技术生成

Java使用JNA调用DLL

1.准备

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

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

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

dceae90f8537

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

}

}

输出结果:

dceae90f8537

image

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

如果出现下面的错误:

dceae90f8537

error.png

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

喜欢请关注一下呦~~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值