基于JNA框架实现JAVA与读写器通信研究.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于JNA框架实现JAVA与读写器通信研究

基于JNA框架实现JAVA与读写器通信研究   【摘要】众所周知,JAVA以跨平台著称,这也是许多程序员喜欢JAVA的原因,但JAVA也有其不足之处,它与硬件设备的通信一直是以使用JNI调用.dll/.so共享类库来实现的,程序员如果使用JNI技术调用.dll/.so文件,首先需要另外编写一个.dll/.so共享库来调用.dll/.so文件中公布的函数,这种调用dll/.so库中的原生函数的JAVA程序非常麻烦,所以对于程序员来说,非到不得已,不会轻易使用JNI技术。为解决JNI技术的繁琐性,本文介绍将一个最新的访问本机代码的JAVA框架—JNA,探讨如何使用JNA技术调用第三方dll文件;并利用这一框架实现与读写器的通信。   【关键词】JNA框架;读写器;通信      一、目前JAVA与硬件设备通信的现状及存在问题   JAVA跨平台的特性深受JAVA程序员的喜爱,这是JAVA的优越性,但是正是为了实现跨平台的目的,JAVA和本地系统的各种内在联系变得很少,这大大约束了它的功能,比如与一些硬件设备的通信,往往要花很大的精力去编写动态函数库来管理设备端口,JDK从1.1版本开始提供了解决这个问题的技术标准:JNI标准;和许多解释执行的语言一样,JAVA提供了调用原生函数的机制,以加强JAVA平台的能力,JavaTMNative Interface(JNI)就是JAVA调用原生函数的机制。   事实上,很多JAVA核心代码内部就是使用JNI实现的,这些JAVA功能实际上是通过原生函数提供的。但是,使用JNI对于JAVA开发者来说简直是一场恶梦;如果你已经有了原生代码,使用JNI,你必须用C语言重新编写一个动态库,这个动态库的唯一功能就是使用JAVA能理解的C代码来调用目标原生函数。一般情况下,设备厂商提供的硬件接口都已经经过一定的封装和处理,不能直接使用JAVA程序通过端口和设备进行通信,JAVA若想与设备进行通信,就必须使用JNI的方式重新编写动态函数库来调用硬件设备,而这种方法的繁冗程度也可想而知,开发效率也不高,因此,人们一直都视JNI为禁地,轻易不愿涉足。   二、解决JAVA与硬件设备通信的新方法   1.什么是JNA框架   JNA(Java Native Access)是一个开源的JAVA框架,由SUN公司主导开发的,建立在经典的JNI基础之上的一个框架,它提供一组JAVA工具??用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个JAVA接口中描述目标native library的函数与结构,JNA将自动实现JAVA接口到native function的映射。[1]   JNA的项目地址:https:///,JNA使JAVA调用原生函数就像.NET上的P/Invoke一样方便快捷,极大的提高程序员编写代码的效率。JNA使JAVA平台可以方便的调用原生函数,这大大扩展了JAVA平台的整合能力,简化了开发难度,又增强了JAVA与硬件设备通信的功能。   2.JNA框架的工作原理   JNA是建立在JNI技术基础之上的一个JAVA类库,它使编程人员可以方便地使用JAVA直接访问动态链接库中的函数,从而实现对.dll/.so文件的访问。原来使用JNI,你必须手工用C写一个动态链接库,在C语言中映射JAVA的数据类型,而编写动态链接库的唯一用途就是使用JAVA能够理解的C代码来调用目标原生函数。同时编写JAVA和C代码的过程使开发的难度大大增加,而这个没其他用途的动态链接库的编写过程显得相当枯燥。JNI调用设备方法如图1所示。   JNA中,它提供了一个动态的C语言编写的转发器,可以自动实现JAVA和C的数据类型映射。作为程序员,不再需要编写C动态链接库,极大地简化了JAVA调用原生函数的过程。当然,这也意味着,使用JNA技术比使用JNI技术调用动态链接库会对性能略有影响,如可能在速度上会降低几倍,但影响并不大。从总体上来看,使用JNA是利远远大于弊的。JNA打破了JAVA和原生代码原本泾渭分明的界限,充分发挥各自擅长领域的分工合作,提高程序员开发的效率。从某种意义上讲,JNA从JNI中来,但却青出于蓝而胜于蓝,逐渐获得了广大开发人员的喜爱。其调用设备方法如图2所示。   3.JNA框架需要注意的细节及技术难点   (1)当前路径是在项目下,而不是bin输出目录下。JNA在搜索dll路径的时候首先是从项目的根路径开始查找,然后再搜索当前操作系统的全局路径,其次搜索path指定的路径。   (2)JNA所使用的数据类型属于JAVA的数据类型,而原生函数中的数据类型是由使用的编程语言决定的,有可能

文档评论(0)

317960162 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档