利用JNative实现Java调用动态库.doc_第1页
利用JNative实现Java调用动态库.doc_第2页
利用JNative实现Java调用动态库.doc_第3页
利用JNative实现Java调用动态库.doc_第4页
利用JNative实现Java调用动态库.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

利用JNative实现Java调用动态库2008-07-07 15:02:18|分类: 默认分类 |标签: |字号大中小订阅 由于项目要求,需要用Java调用windows的dll文件,查了一下,如果用JNI的话是比较麻烦的,在上搜索了一下“Java dll”,首先出现的是Jnative,于是决定用它,后来也试了些别的,但还是JNative好使,简单总结如下:Java调用动态库所需要关心的问题:l 如何装载dll文件,以及如何定位所要使用的方法;l 数据类型是如何对应的;l 如何给使用的方法传递参数;l 如何获取返回的值。JNative INFO:Resource URL: / Source Code: /projects/jnative Detailed Review: http:/jnative.free.frJavaDOC: http:/jnative.free.fr/docs/Version:1.3一个开源的组件,通过它调用已有动态库中的方法就非常的方便,支持CallBack 。为什么选择JNative同类的开源组件相对活跃的还有,JNA ( Java Native Access ), Jawin,Nativecall,etc.但是Jnative 相对更容易使用,它对数据类型的处理做的更好。l JNA 需要用户对所使用的DLL文件事先进行封装,才能装载。另外需要在一个java接口中描述目标DLL中的函数与结构,从而使JNA自动实现Java接口到native function的映射,较麻烦。l Nativecall 暂时还不知道如何装载dll文件。l Jawin 数据类型匹配相当敏感,它采用一种叫做”instruction string”的格式来传递参数,还没有完全理解。How to:解压JNative-1.3.2.zip 获得三个文件,分别是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。JNativeCpp.dll Windows下用的,拷到windows / system32目录下;libJNativeCpp.so Linux下的咚咚;JNative.jar这是一个扩展包,将其copy到C:jdkjrelibext 下(我的目录结构),系统会自动加载。结构映射(Structure Mapping)TypeLength JNative classDWORD4org.xvolks.jnative.misc.basicStructures.LONGHWND4org.xvolks.jnative.misc.basicStructures.HWNDCOLORREF 4org.xvolks.jnative.misc.basicStructures.LONGCOLORREF*4org.xvolks.jnative.pointers.PointerLPARAM4org.xvolks.jnative.misc.basicStructures.LPARAMLPCCHOOKPROC4org.xvolks.jnative.util.CallbackLPCTSTR4org.xvolks.jnative.pointers.Pointer方法Class作用一般用到的方法(参数略,参考Doc)org.xvolks.jnative.Jnative装载dll文件,定位函数JNative(),setParameter(),setRetVal(),getRetVal() .xvolks.jnative.pointers.Pointer替代本地函数中的的指针,需要先申请一块内存空间,才能创建Pointer(),dispose()org.xvolks.jnative.pointers.memory.MemoryBlockFactory申请一块内存空间createMemoryBlock()org.xvolks.jnative.exceptions.NativeException抛出装载,定位等方面的异常org.xvolks.jnative.Type列举和管理Jnative需要的不同的数据类型简单测试,Javadoc 下和官方网上有些例子,下面的是我随便从IC读卡程序中找了个DLL进行的测试:SCReader.dll 下的SCHelp_HexStringToBytes()函数原型 SCREADER_API WINAPI long SCHelp_HexStringToBytes(LPCTSTR pSrc,BYTE* pTar,int MaxCount);注意:dll文件需要放到System32下,否则可能找不到通过Jnative 用java 来调用代码如下package onlyfun.dllcall;import org.xvolks.jnative.JNative;import org.xvolks.jnative.exceptions.NativeException;import org.xvolks.jnative.pointers.Pointer;import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;import org.xvolks.jnative.Type;public class UserCall /* * return 转换成功的字节数 */ static JNative Something = null; static Pointer pointer; public String getSomething(String pSrc, Pointer pTar, int MaxCount) throws NativeException, IllegalAccessException try if(Something = null) pTar = new Pointer(MemoryBlockFactory.createMemoryBlock(36); Something = new JNative(SCReader.DLL, SCHelp_HexStringToBytes);/ 利用org.xvolks.jnative.JNative 来装载 SCReader.dll,并利用其SCHelp_HexStringToBytes方法 Something.setRetVal(Type.INT);/ 指定返回参数的类型 int i=0; Something.setParameter(i+,pSrc); Something.setParameter(i+,pTar); Something.setParameter(i+,MaxCount); System.out.println(调用的DLL文件名为:+Something.getDLLName(); System.out.println(调用的方法名为:+Something.getFunctionName();/传值 Something.invoke();/调用方法 return Something.getRetVal(); finally if(Something!=null) Something.dispose();/释放 public Pointer creatPointer() throws NativeException pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(36); pointer.setIntAt(0, 36); return pointer; public static void main(String args) throws NativeException, Ille

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论