java如何利用JNative调用dll文件
下文参考自:http://blog.163.com/wex660@126/blog/static/2415306520103142363964/
因为项目需要,用到了java调用dll文件中的方法。写成dll文件大多是用C、VB、Delphi语言弄成的,对于我这个纯粹干java的人员来说,着实让我太为难了。唉,也就是说我编程底子没有搭好,惭愧。要是这些语言我都会些,也不至少让我了解并应用这个技术花了很长时间。
我是用JNative技术做的一个例子。需要用到的是:JNative.jar,JNative.dll这些是在Windows中开发的,如果用Linus要用到libJNative.so
1.将JNative.dl,所要读的dll文件l放在C:\windows\system32下面。
2.将JNative.jar放在你的项目下的lib下面
3.将要读的dll文件放在跟使用的类相同的目录下。
4.我的类的源码 .MemoryBlockFactory;
public class SystemTime extends AbstractBasicData<SystemTime>{public short wYear;public short wMonth;public short wDayOfWeek;public short wDay;public short wHour;public short wMinute;public short wSecond;public short wMilliseconds;/*** 分配内存,并返回指针*/public Pointer createPointer() throws NativeException {pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));return pointer;}/*** 内存大小*/public int getSizeOf(){return 8 * 2;}/*** 获取通过内存指针解析出结果*/public SystemTime getValueFromPointer() throws NativeException {wYear = getNextShort();wMonth = getNextShort();wDayOfWeek = getNextShort();wDay = getNextShort();wHour = getNextShort();wMinute = getNextShort();wSecond = getNextShort();wMilliseconds = getNextShort();return this;}public SystemTime() throws NativeException{super(null);createPointer();}public String toString(){return wYear + "/" + wMonth + "/" + wDay + " at + " + wHour + ":" + wMinute + ":" + wSecond + ":" + wMilliseconds;}public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {// 创建对象JNative nGetSystemTime = new JNative("Kernel32.dll", "GetSystemTime");SystemTime systemTime = new SystemTime();// 设置参数nGetSystemTime.setParameter(0, systemTime.getPointer());nGetSystemTime.invoke();// 解析结构指针内容return systemTime.getValueFromPointer();}public static void main(String[] args) throws NativeException, IllegalAccessException{System.err.println(GetSystemTime());}}
注:Kernel32.dll是我要读的dll文件,GetSystemTime是dll文件中的方法(就是所谓的函数名)
That's ok,相信我这么不懂dll的都能做出来,你也能
===============================另一个参考====================================
下文参考自:http://blog.csdn.net/volant_hoo/article/details/2102726
因为项目需求,需要在java中调用dll文件。测试过几种方法,发现还是JNative最为便利。
1. 安装
到jnative.sourceforge.net下载最新的JNative二进制包,解压后得到3个文件:JNativeCpp.dll,libJNativeCpp.so,JNative.jar,其中:
JNativeCpp.dll 放在windows/system32目录下
libJNativeCpp.so linux下使用
JNative.jar 导入工程中
2. 使用
2.1. 加载dll文件
JNative可使用两种方式加载dll文件:
使用System.loadLibrary加载
使用此方法可加载系统目录中的dll文件。可以先把dll文件复制到system32目录下,使用文件前缀名作为参数来加载dll文件。
使用System.load加载
此方法参数为dll文件全路径名。
2.2. 调用函数
1、首先创建JNative对象:
JNative jnative = new JNative(dll文件名, 函数名);
2、设置返回值类型:
jnative.setRetVal(Type.INT);
3、设置参数
jnative.setParameter(0, Type.STRING, …); //设置第一个参数为字符串
jnative.setParameter(1, Type.INT, String.valueof(…)); //设置第二个参数为整数
4、执行
n.invoke();
5、获取返回值
Integer.parseInt(jnative.getRetVal());
2.3. 一个实例
来自国外网上的一个实例,用于摸索struct处理方法:
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;/*** SystemTime* * typedef struct _SYSTEMTIME {* WORD wYear;* WORD wMonth;* WORD wDayOfWeek;* WORD wDay;* WORD wHour;* WORD wMinute;* WORD wSecond;* WORD wMilliseconds;* } SYSTEMTIME, */
public class SystemTime extends AbstractBasicData<SystemTime> {public short wYear;public short wMonth;public short wDayOfWeek;public short wDay;public short wHour;public short wMinute;public short wSecond;public short wMilliseconds;/*** 分配内存,并返回指针*/public Pointer createPointer() throws NativeException {pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));return pointer;}/*** 内存大小*/public int getSizeOf() {return 8 * 2;}/*** 获取通过内存指针解析出结果*/public SystemTime getValueFromPointer() throws NativeException {wYear = getNextShort();wMonth = getNextShort();wDayOfWeek = getNextShort();wDay = getNextShort();wHour = getNextShort();wMinute = getNextShort();wSecond = getNextShort();wMilliseconds = getNextShort();return this;}public SystemTime() throws NativeException {super(null);createPointer();}public String toString() {return wYear + "/" + wMonth + "/" + wDay + " at + " + wHour + ":" + wMinute + ":" + wSecond+ ":" + wMilliseconds;}public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {// 创建对象JNative nGetSystemTime = new JNative("Kernel32.dll", "GetSystemTime");SystemTime systemTime = new SystemTime();// 设置参数nGetSystemTime.setParameter(0, systemTime.getPointer());nGetSystemTime.invoke();// 解析结构指针内容return systemTime.getValueFromPointer();}public static void main(String[] args) throws NativeException, IllegalAccessException {System.err.println(GetSystemTime());}}
java如何利用JNative调用dll文件相关推荐
- java中调用dll文件的两种方法
https://www.cnblogs.com/huozhong/p/5830485.html JNA地址:http://blog.csdn.net/shendl/article/details/35 ...
- 关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序。
关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. 参考文章: (1)关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. (2)https://www. ...
- 关于java调用Dll文件的异常 Native library (win32-x86-64/CtrlNPCDLL.dll) not found in resource pat
关于java调用Dll文件的异常 Native library (win32-x86-64/CtrlNPCDLL.dll) not found in resource pat 参考文章: (1)关于j ...
- 利用JNative调用MediaInfo.dll
利用JNative调用MediaInfo.dll实现获取媒体信息 MediaInfo mi = new MediaInfo(); mi.Open(dir+filename); String info ...
- java jni dll路径_Java中Jni调用DLL文件试验
Java中Jni调用DLL文件试验 下面是小编整理的Java中Jni调用DLL文件试验内容,希望可以为您带来帮助!更多内容请关注应届毕业生考试网! 所有文件均在E:\路径下. 安装jdk1.6.0_0 ...
- Java如何利用JNI调用C++(简略介绍及步骤)
Java如何利用JNI调用C++(简略介绍及步骤) 文章目录 Java如何利用JNI调用C++(简略介绍及步骤) 一.原理介绍 二.详细步骤 步骤一:编写Java类 步骤二:生成.h文件 步骤三:CL ...
- labview如何加载库_LabVIEW如何方便地调用DLL文件
转自:http://bbs.elecfans.com/jishu_469502_1_1.html LabVIEW调用DLL文件 LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用.比如, ...
- jar调用dll文件提示找不到指定的模块Unable to load library
目录 问题描述 解决方案一 解决方案二 效果 补充说明 参考链接 问题描述 在Windows系统上,自己开发的需要使用JNA调用动态链接库dll文件的Swing项目(Java简易系统监视器system ...
- 使用Java中的jna调用dll
简介: 在我们日常编码中在与硬件通信或者与其他的c++平台通信的时候经常用java调用dll文件,下面我们介绍俩种使用jna调用dll的方式. 如果是自己部门写的dll文件,一般会有头文件,头文件中会 ...
最新文章
- NSArray,NSSet,NSDictionary总结 (转)
- C# - 委托中的逆变
- SARscape_5.2.0和SARscape_5.2.1安装包下载
- 2012服务器文件加密,Windows Server 2012安全方面的改变_服务器评测与技术-中关村在线...
- arcgis js 4.x 地图中加入图片
- 求1到n ,这n个整数的二进制表示比特1的个数(时间复杂度:O(n))
- 一文带你初识---虚拟dom
- bmp文件头_图像算法原理与实践——图像文件存储
- Python库大全涵盖了Python应用的方方面面建议收藏留用!
- cxgrid中纵横单元格合并_逆向查询合并单元格中的数据,这两种方法你值得拥有...
- cat 监控 java,分布式监控CAT客户端的SpringBoot集成
- 前端分页功能(通用)
- 笔记本电脑找不到个人热点的解决方法
- 用python 读取excel 指定列
- 急!程序员夫妻结婚了,婚戒上刻什么字好?
- 先验概率和后验概率那点事儿
- 推荐一个svg转ico的在线网站(非常清晰)
- PXE网络批量装机+Kickstart无人值守安装
- IT人员必学最基础知识(四)——补充总结
- Cognos产品功能介绍