java使用动态库之JNA

本文介绍如何使用Java Native Access (JNA) 库调用C/C++编写的动态链接库(DLL),包括JNA的准备工作、代码示例及常见问题解决方法。

前言

个人拙见:java也不是万能的,对于一些底层的处理或者使用已经写好的C的代码,java就要寄出两大法宝:JNI和JNA。JNI和JNA其实很相似,但是如果对速度要求不高的情况下,我个人选择使用起来较为容易的JNA。
JNA可以直接调用C/C++编写的DLL文件
这个就是我们为什么要使用JNA的原因了。

准备工作

下载导入两个jar
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

简单示例

代码结构:
在这里插入图片描述
代码示例:

package lyrics;

import com.sun.jna.Library;
import com.sun.jna.Native;

public class JNATest {

	public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary("msvcrt",CLibrary.class);
		void printf(String format, Object... args);
	}
	
	public static void main(String[] args){
		try{
			CLibrary.INSTANCE.printf("Hello, World!!");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

类型对照

首先 int肯定是int了,这些基础的都差不多
比较值得一提的是以下这些比较骚的操作
1.boolean该怎么办?
这个建议转换为byte读取
2.char* 、const char *、const unsigned char *对应什么?
相信我,统统用String。
3.&反写的数据该怎么弄,如&int?
IntByReference.
4.结构体呢?
结构体 * -> Pointer
结构体 ** -> PointerByReference
5.IntByReference,PointerByReference怎么取值?
getvalue,getString,getByte,get……
getPoint,getPointArray()……
具体问题具体分析,结合C++中结构体的声明定义,组合上面的这些方法就能得到相应的值。

注意

调用动态库可能会遇到一些问题:

1.直接报找不到动态库?
这种情况一般是你动态库路径不对,拼写不对,或者多写了.dll这几个字符,当然前提是你要导入jar
2.报在classpath中找不到什么什么东西?
这种情况有可能是你调用的动态库需要其他动态库支持,你没有复制完动态库。
3.致命错误,无法启动虚拟机什么的?
检查自己环境配置,jre是不是1.8,编译环境是不是1.8等等
4.不是有效32位或64位dll文件?
这种情况可能是,你的动态库是64位或者32位,而你eclipse不是或者说jre不是,两者不匹配导致等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值