999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于JNA框架實現JAVA與讀寫器通信的研究

2012-04-27 10:30:22廣州輕工職業學校劉魁元
電子世界 2012年2期
關鍵詞:跨平臺設備

廣州輕工職業學校 劉魁元

廣州市機電高級技工學校 余楷鑫

一、目前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.dev.java.net/,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所示。

表1 JAVA與C語言數據結構的對應關系

圖1 JNI調用設備方法

圖2 JNA調用設備方法

3.JNA框架需要注意的細節及技術難點

(1)當前路徑是在項目下,而不是bin輸出目錄下。JNA在搜索dll路徑的時候首先是從項目的根路徑開始查找,然后再搜索當前操作系統的全局路徑,其次搜索path指定的路徑。

(2)JNA所使用的數據類型屬于JAVA的數據類型,而原生函數中的數據類型是由使用的編程語言決定的,有可能是C、Delphi等語言的數據類型。JAVA與C語言數據結構的對應關系如表1所示。

4.JNA編程過程

Dll是C函數的集合、容器,這正和接口的概念吻合。JNA把一個dll/.so文件看做是一個JAVA接口,JNA通過調用接口來實現與第三方dll的通信。下面我們將以一個例子來說明如何調用dll中的函數。

(1)首先我們定義這樣一個接口

(2)分析過程如下所示

如果dll是以stdcall方式輸出函數,那么就繼承StdCallLibrary。否則就繼承默認的Library接口。接口內部需要一個公共靜態常量:sdtapi。

通過這個常量,就可以獲得這個接口的實例,從而使用接口的方法。也就是調用外部dll的函數!注意:1) Native.loadLibrary()函數有2個參數:第一個參數是dll或者.so文件的名字,但不帶后綴名。這符合JNI的規范,因為帶了后綴名就不可以跨操作系統平臺了。第二個參數是本接口的Class類型。JNA通過這個Class類型,根據指定的dll/.so文件,動態創建接口的實例。2)接口中你只需要定義你需要的函數或者公共變量,不需要的可以不定義。

boolean USB_DevInit(int port);

參數和返回值的類型,應該和dll中的C函數的類型一致。這是JNA,甚至所有跨平臺調用的難點。這里,C語言的函數參數是:int port;JNA中對應的JAVA類型也是int,所以我們在做跨平臺的時候,在數據類型上的選擇應該盡量做到簡單,這有利于跨平臺的實現。

5.JNA的不足與補充

我們已經見識了JNA的強大。但是,有些需求還是必須求助于JNI。JNA是建立在JNI技術基礎之上的一個框架。使用JNI技術,不僅可以實現JAVA訪問C函數,也可以實現C語言調用JAVA代碼。而JNA只能實現JAVA訪問C函數,作為一個JAVA框架,自然不能實現C語言調用JAVA代碼。此時,你還是需要使用JNI技術。JNI是JNA的基礎,是JAVA和C互操作的技術基礎。

三、如何利用JNA框架實現與讀寫器的通信

目前市場上的大多硬件廠商提供的開發包是原生函數,比如讀寫設備就是這個情況,一般設備廠商會提供兩種類型的類庫文件,windows系統的會包含.dll/.h/.lib文件,而linux會包含.so/.a文件,這里只討論windows系統下的c/c++編譯的dll文件調用方法。

現在來討論這樣一個問題,我們現要為JAVA項目添加IC卡讀寫器功能,設備廠商提供了一個fkc60.dll動態庫,下面以其中的二個函數為例:

1.打開串口函數

1)bool USB_DevInit(int port);

2)用途及說明:調用其它函數前先打開串口,成功返回true,失敗返回false;

3)參數:port表示串行口,1為端口1,2為端口2,以此類推。

2.控制讀寫器發聲函數

1)bool USB_BeepEx(int port,int ptype);

2)用途及說明:控制讀寫器發聲;成功返回true,失敗返回false;

3)參數:port表示串口號,1為端口1,2為端口2,以此類推,ptype表示發聲類型0發短聲,1發長聲。

首先,你需要下載一個jna.jar包,就可以方便地調用動態鏈接庫中的C函數了,在JAVA項目中引入jna.jar包,本例是把fkc60放在項目的lib目錄下引入的。

最后執行可以看到控制臺中打印串行口打開成功信息,并聽到讀寫器發出了短聲。

四、結束語

JNA技術相對于JNI技術確實提高了開發的效率,并且擴展了JAVA的功能,但它仍存在著一個缺陷,即破壞了JAVA程序的最重要優點:平臺無關性,所以除非必須(不得不)使用JNA技術,一般還是提倡寫100%純JAVA程序,根據自己的經驗和查閱的一些資料,把可以使用JNA的情況羅列如下:

1.需要直接操作物理設備,而沒有相關的驅動程序;

2.用JAVA會產生系統難以支付的開銷,如需要大量網絡鏈接的場合;

3.存在大量可重用的C/C++代碼,通過JNA可以減少開發工作量,避免重復開發。

[1]沈東良.深入淺出JNA—快速調用原生函數[J].程序員,2009,3.

[2]匿名.JNA—JNI終結者.

猜你喜歡
跨平臺設備
諧響應分析在設備減振中的應用
跨層級網絡、跨架構、跨平臺的數據共享交換關鍵技術研究與系統建設
一款游戲怎么掙到全平臺的錢?
電腦報(2021年11期)2021-07-01 08:10:05
基于VB6.0+Access2010開發的設備管理信息系統
跨平臺APEX接口組件的設計與實現
測控技術(2018年9期)2018-11-25 07:44:58
基于MPU6050簡單控制設備
電子制作(2018年11期)2018-08-04 03:26:08
500kV輸變電設備運行維護探討
工業設計(2016年12期)2016-04-16 02:52:00
基于QT的跨平臺輸電鐵塔監控終端軟件設計與實現
如何在設備采購中節省成本
基于OPC跨平臺通信的電機監測與診斷系統
主站蜘蛛池模板: 国产人免费人成免费视频| 香蕉久人久人青草青草| 中文一级毛片| 亚洲男人的天堂在线| 欧美区一区二区三| 91久久偷偷做嫩草影院精品| 国产sm重味一区二区三区| A级毛片无码久久精品免费| 114级毛片免费观看| 中文字幕乱码中文乱码51精品| 日韩毛片免费视频| 2021国产乱人伦在线播放| 女人av社区男人的天堂| 91久久青青草原精品国产| 日韩国产黄色网站| 真人高潮娇喘嗯啊在线观看| 青青久久91| 久久国产高潮流白浆免费观看| 国产精品尹人在线观看| 午夜视频www| 中文字幕啪啪| 欧美日本二区| 原味小视频在线www国产| 亚洲高清在线天堂精品| 国产亚洲精| 国产精品亚洲精品爽爽| 亚洲性一区| 亚洲欧美另类久久久精品播放的| 国产xxxxx免费视频| 免费观看男人免费桶女人视频| 欧美激情首页| 99ri国产在线| 99国产精品免费观看视频| 伊人久久精品无码麻豆精品| 69综合网| 国产视频自拍一区| 亚洲精品图区| 欧洲免费精品视频在线| 国产成人高清精品免费| 成年A级毛片| 草逼视频国产| 久久久久亚洲AV成人人电影软件| 亚洲男人天堂久久| 波多野结衣无码视频在线观看| 亚洲一级毛片| 香蕉精品在线| 国产美女人喷水在线观看| 国产欧美日韩资源在线观看| 精品久久久久成人码免费动漫| 亚洲天堂首页| 亚洲精品福利网站| 亚洲欧州色色免费AV| 她的性爱视频| 久久久受www免费人成| 亚洲国产欧洲精品路线久久| 久久久91人妻无码精品蜜桃HD | 91视频首页| 秘书高跟黑色丝袜国产91在线| 免费啪啪网址| 国产免费好大好硬视频| 精品国产自在在线在线观看| 三级视频中文字幕| 亚洲综合久久一本伊一区| 日韩av无码精品专区| 亚洲欧美人成人让影院| 国产亚洲精品精品精品| 亚洲a级在线观看| 伊人网址在线| 国产精品福利导航| 国产高清在线观看91精品| 欧美色图久久| yjizz视频最新网站在线| 亚洲视频a| 91香蕉国产亚洲一二三区| 91国内视频在线观看| 亚洲一区二区三区在线视频| 亚洲欧洲美色一区二区三区| 午夜一级做a爰片久久毛片| 亚洲综合片| 亚洲人成网站18禁动漫无码| 中文字幕亚洲另类天堂| 久久久四虎成人永久免费网站|