java dll 调用方法_关于Java调用dll的方法 | 学步园
Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性。
Java调用C/C 写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异,所以在参数传递过程中容易出现问题。
使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin,
Jacob. 其中JNI(Java Native
Interface)是Java语言本身提供的调用本地已编译的函数库的方法,本身具有跨平台性,可以在不同的机器上调用不同的本地库。Jawin和
Jacob都是sourceforge.net的开源项目,都是基于JNI技术的依赖Windows的实现,使得在Windows平台下使用COM和
DLL的更加方便。
三、JNI
sun相关文档:http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html
JNI的完整例子 :http://www.pconline.com.cn/pcedu/empolder/gj/java/0506/642328.html
JNI的应用方案是基于Java类和本地函数相映射的。其使用DLL的步骤还是相对比较麻烦,不但涉及到Java编程,还涉及到C/C 编程。
JNI的使用步骤是:
1.编写Java类,用该类将DLL对外提供的函数服务进行声明,其中的Java方法均声明为native,其方法签名可以自定义,不用实现函数体。
2.用Javah工具将该Java类生成对应的.h头文件。
3.最重要的比较麻烦的一步:编写C/C
代码实现.h头文件中声明的函数,该C/C
代码中包含jni.h头文件,并且编写代码时使用其中定义好的数据类型作为函数的输入和返回数据类型进行编程。用这种方法实现数据类型转换。例如数据类
型:boolean(java) à jboolean(jni.h: typedef unsigned char
jboolean),在自己编写的C/C 代码中使用数据类型jboolean映射Java中的boolean类型。在该步骤中,可以在C/C
代码中调用已经存在的DLL库。
4.另外编写的Java代码时就可以使用该Java类了。
在第3步中,编写C/C 函数时,可以使用一个叫interface pointer的env指针来调用JNI提供的一系列(很多)函数,用这些函数来访问JVM的对象和数据。
使用JNI的缺点:使用比较麻烦,需要对已有的DLL进行封装,需要对C/C 比较了解。
使用JNI的优点:可以跨平台调用本地库。
四、Jawin
官方网站:http://jawinproject.sourceforge.net/
官方文档(Jawin介绍): http://jawinproject.sourceforge.net/jawin.html
官方文档(Jawin使用DLL):http://jawinproject.sourceforge.net/jawinuserguide_dll.html
官方文档(Jawin数据指令): http://jawinproject.sourceforge.net/instruction_docs.html
Jawin的应用方案是基于函数调用时采用原始字节流传递数据的。就是在Java中指明一个DLL中的某个函数后,通过原始字节流(需要考虑参数数据类型
所占的存储字节数及系统使用的字节序列)传递给该DLL函数需要的参数,其返回值也是通过原始字节流解析的方式获得正确的值。
Jawin的使用步骤:
1.环境配置:下载Jawin;Jawin.dll放入工程目录下;Jawin.jar相关jar文件加入到运行库中(LibPath或者Eclipse下配置工程的BuildPath-AddLibrary)。
2.获得函数指针:new FuncPtr("DllFileName.DLL", "dllFunctionName");
3.用LittleEndianOutputStream将函数需要的参数写入到一个原始字节流NakedByteStream。
4.最重要的一步:调用FuncPtr.invoke()。传入参数比较复杂。
5.解析上一步的返回值(字节数组)。
第4步中传入的参数包括:
1.指令字符串。一个"XXX:Y:ZZZ"格式的字符串。其含义分别是传入参数中的每个字节的数据类型意义、返回值的类型、需要从传入指针中读取的数据(inout类型参数)。比如:
函数签名int func(int, int, struct s*, char*); //其中struct s*调用完函数后需要读出,struct s所占字节数为16。
其指令字符串为:IIP16G:I
4L4n16L4。该字符串在解析返回值(字节数组)时,首先应该是返回类型I对应的4个字节,然后是inout类型的参数中n16对应的16个字节。
其中字符串的意义可以在Jawin提供的文件instructions.h中找到,或者在官方文档(Jawin数据指令)中找到常用的一些指令字符串的意义。
2.传入参数的总字节大小。
3.前面写好的传入参数的原始字节流。
4.一个object数组。
5.ReturnFlags,用以根据C/C 返回值将C/C
的错误转换为Java的异常并抛出。其中CHECK_NONE表示不检查;CHECK_FALSE和CHECK_WIN32分别表示返回0是FALSE和
SUCCESS,根据是否出错决定是否抛出异常;CHECK_HRESULT表示使用COM模型中的HRESULT作为返回值,其错误码可以配置。
使用Jawin的缺点:不方便调试,几乎所有的错误都抛出同样的异常COMException;需要对数据类型的转换比较了解;不能跨平台,对Windows的依赖性比较强。
使用Jawin的优点:方便使用,不用进行C/C 开发,不用对原始DLL进行封装就可以方便使用。
五 Jacob
官方文档:http://danadler.com/jacob/
Jacob是Java-Com Bridge的缩写,也可以用来调用DLL。其底层也是使用JNI实现,也具有Windows 的平台依赖性,但是网上有人反映其易用性不如jawin。
java dll 调用方法_关于Java调用dll的方法 | 学步园相关推荐
- java 全排列 非递归_全排列(递归与非递归实现) | 学步园
1.算法简述 简单地说:就是第一个数分别以后面的数进行交换 E.g:E = (a , b , c),则 prem(E)= a.perm(b,c)+ b.perm(a,c)+ c.perm(a,b) 然 ...
- java 三维向量类_计算几何,三维向量的旋转 | 学步园
写这篇日志有两个目的:一来是想测试新装上去的LaTeX插件显示数学公式是否好用(不过貌似通过RSS获取到的日志是没有办法显示的--):二来是对于三维向量绕任意轴的旋转之前我都是用结论的,今天因为做计算 ...
- java项目----教务管理系统_基于Java的教务管理系统
java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...
- 从java里调用r jri的设置方法_从Java里调用R – JRI的设置方法
JRI允许用户从Java里面调用R的功能,而Eclipse是目前最常用的Java开发环境.本文介绍在Eclipse里设置JRI的方法. 环境: Windows 7 32bit Eclipse 3.6 ...
- java进程里面调用方法_在java里面调用CUI程序的方法
在java里面调用CUI程序的方法推荐查看本文HTML版本 在java里面调用CUI程序的方法 问题描述: 该函数在win平台上面调用不是很成功,GUI会可以调出来,但可能和屏蔽调其中的一些用 ...
- java多态调用优先级_关于java的多态方法调用顺序的问题
使用父类类型的引用指向子类的对象,该引用调用的师父类中定义的方法和变量,变量不能被重写(覆盖):如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法: 注意特殊情况,如 ...
- java为何重复调用方法_通过反射调用Java中的getter:重复调用它的最快方法是什么(在性能和可伸缩性方面)?...
小编典典 您可以使用MethodHandle.其Javadoc写道: 使用Lookup API中的工厂方法,可以将Core Reflection API对象表示的任何类成员转换为行为等效的方法句柄.例 ...
- java 调用关系_【Java基础】几种简单的调用关系与方法
直接上代码吧. class lesson4AB //同一个类下的public修饰的方法A,B可以相互调用 { public void A() { B();//等价于this.B(); } public ...
- java反射的优化_请问Java反射的性能为什么比直接调用慢一个数量级左右?
Method.invoke()本身要用数组包装参数:而且每次调用都必须检查方法的可见性(在Method.invoke()里),也必须检查每个实际参数与形式参数的类型匹配性(在NativeMethodA ...
最新文章
- 题目 1093:【蓝桥杯】【入门题】字符逆序
- Python——with语句、context manager类型和contextlib库
- 《Python核心编程》第二版第36页第二章练习 续一 -Python核心编程答案-自己做的-...
- javascript滚动文字
- android 状态栏 背景色_技术一面:说说Android动态换肤实现原理
- kegra:用Keras深度学习知识图
- java中如何检查字符串都是数字_如何在Java中检查字符串是否为数字?
- 基于HTML5手机上下滑动翻页特效
- P1047 [NOIP2005 普及组] 校门外的树(python3实现)
- 元素属性、类名、内容、获取和设置、删除
- 手机浏览器中屏蔽img的系统右键菜单context menu
- 神经网络中的Softmax激活函数
- 推荐Python十大经典练手项目,让你的Python技能点全亮!
- mysql metadata lock(二)
- DELMIA软件物流仿真:机器人输送带上下料虚拟仿真操作方法
- 数字图像处理:图像与编码
- 2022-2028年中国美妆工具行业市场前瞻与投资战略规划分析报告
- 什么是敏捷开发?它有什么特点
- 双频wifi是什么意思 双频wifi好处有哪些
- PS更换证件照背景色,并去除人物像边线