快速业务通道

教你在java中使用dll方法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

教你在java中使用dll方法

时间:2011-10-02 blogjava caitong

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

http://www.bt285.cn/  或是 http://www.5a520.cn/

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的优点:可以跨平台调用本地库。

教你在java中使用dll方法(2)

时间:2011-10-02 blogjava caitong

四、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 http://www.feng123.com/

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:I4L4n16L4。该字符串在解析返回值(字节数组)时,首先应该是返回类型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。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号