[java]使用jni技術(shù)實(shí)現(xiàn)java程序調(diào)用dll_第1頁
已閱讀1頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、JAVA的跨平臺的特性深受java程序員們的喜愛但正是由于它為了實(shí)現(xiàn)跨平臺的目的使得它和本地機(jī)器的各種內(nèi)部聯(lián)系變得很少大大約束了它的功能比如與一些硬件設(shè)備通信往往要花費(fèi)很大的精力去設(shè)計(jì)流程編寫代碼去管理設(shè)備端口而且有一些設(shè)備廠商提供的硬件接口已經(jīng)經(jīng)過一定的封裝和處理不能直接使用java程序通過端口和設(shè)備通信這種情況下就得考慮使用java程序去調(diào)用比較擅長同系統(tǒng)打交道的第三方程序從1.1版本開始的JDK提供了解決這個(gè)問題的技術(shù)標(biāo)準(zhǔn):JNI

2、技術(shù).JNI是JavaNativeInterface(Java本地接口)的縮寫本地是相對于java程序來說的指直接運(yùn)行在操作系統(tǒng)之上與操作系統(tǒng)直接交互的程序.從1.1版本的JDK開始JNI就作為標(biāo)準(zhǔn)平臺的一部分發(fā)行.在JNI出現(xiàn)的初期是為了Java程序與本地已編譯語言尤其是C和C的互操作而設(shè)計(jì)的后來經(jīng)過擴(kuò)展也可以與c和c之外的語言編寫的程序交互例如Delphi程序.使用JNI技術(shù)固然增強(qiáng)了java程序的性能和功能但是它也破壞了java的

3、跨平臺的優(yōu)點(diǎn)影響程序的可移植性和安全性例如由于其他語言(如CC)可能能夠隨意地分配對象占用內(nèi)存Java的指針安全性得不到保證.但在有些情況下使用JNI是可以接受的甚至是必須的例如上面提到的使用java程序調(diào)用硬件廠商提供的類庫同設(shè)備通信等目前市場上的許多讀卡器設(shè)備就是這種情況.在這必須使用JNI的情況下盡量把所有本地方法都封裝在單個(gè)類中這個(gè)類調(diào)用單個(gè)的本地庫文件并保證對于每種目標(biāo)操作系統(tǒng)都可以用特定于適當(dāng)平臺的版本替換這個(gè)文件這樣使用J

4、NI得到的要比失去的多很多.現(xiàn)在開始討論上面提到的問題一般設(shè)備商會提供兩種類型的類庫文件windows系統(tǒng)的會包含.dll.h.lib文件而linux系統(tǒng)的會包含.so.a文件這里只討論windows系統(tǒng)下的cc編譯的dll文件調(diào)用方法.我把設(shè)備商提供的dll文件稱之為第三方dll文件之所以說第三方是因?yàn)镴NI直接調(diào)用的是按它的標(biāo)準(zhǔn)使用cc語言編譯的dll文件這個(gè)文件是客戶程序員按照設(shè)備商提供的.h文件中的列出的方法編寫的dll文件我稱

5、之為第二方dll文件真正調(diào)用設(shè)備商提供的dll文件的其實(shí)就是這個(gè)第二方dll文件.到這里解決問題的思路已經(jīng)產(chǎn)生了大慨分可以分為三步:1編寫一個(gè)java類這個(gè)類包含的方法是按照設(shè)備商提供的.h文件經(jīng)過變形轉(zhuǎn)換處理過的并且必須使用native定義.這個(gè)地方需要注意的問題是java程序中定義的方法不必追求和廠商提供的頭文件列出的方法清單中的方法具有相同的名字返回值參數(shù)因?yàn)橐恍﹨?shù)類型如指針等在java中沒法模擬只要能保證這個(gè)方法能實(shí)現(xiàn)原dll

6、文件中的方法提供的功能就行了2按JNI的規(guī)則使用cc語言編寫一個(gè)dll程序3按dll調(diào)用dll的規(guī)則在自己編寫的dll程序里面調(diào)用廠商提供的dll程序中定義的方法.我之前為了給一個(gè)java項(xiàng)目添加IC卡讀寫功能曾經(jīng)查了很多資料發(fā)現(xiàn)查到的資料都是只說到第二步所以剩下的就只好自己動手研究了.下面結(jié)合具體的代碼來按這三個(gè)步驟分析.1假設(shè)廠商提供的.h文件中定義了一個(gè)我們需要的方法:__int16__stdcallreadData(HLEicd

7、ev__int16offset__int16lenunsigneddata_buffer)a.__int16定義了一個(gè)不依賴于具體的硬件和軟件環(huán)境在任何環(huán)境下都占16bit的整型數(shù)據(jù)(java中的int類型是32文件內(nèi)容如下:DONOTEDITTHISFILEitismachinegenerated#includeHeaderfclasstest_LinkDll#ifndef_Included_test_LinkDll#defineIn

8、cluded_test_LinkDll#ifdef__cplusplusextern“C“#endifClass:test_LinkDllMethod:readDataTempSignature:(III)LjavalangStringJNIEXPTjstringJNICALLJava_test_LinkDll_readDataTemp(JNIEnvjobjectjintjintjint)#ifdef__cplusplus#endif#

9、endif可以看出JNI為了實(shí)現(xiàn)和dll文件的通信已經(jīng)按它的標(biāo)準(zhǔn)對方法名參數(shù)類型參數(shù)數(shù)目作了一定的處理其中的JNIEnvjobjtct這兩個(gè)參數(shù)是每個(gè)JNI方法固有的參數(shù)javah命令負(fù)責(zé)按JNI標(biāo)準(zhǔn)為每個(gè)java方法加上這兩個(gè)參數(shù).JNIEnv是指向類型為JNIEnv_的一個(gè)特殊JNI數(shù)據(jù)結(jié)構(gòu)的指針當(dāng)由C編譯器編譯時(shí)JNIEnv_結(jié)構(gòu)其實(shí)被定義為一個(gè)類這個(gè)類中定義了很多內(nèi)嵌函數(shù)通過使用““符號可以很方便使用這些函數(shù)如:(env)New

10、String(jcjintlen)可以從指針c指向的地址開始讀取len個(gè)字符封裝成一個(gè)JString類型的數(shù)據(jù).其中的j對應(yīng)于cc中的jint對應(yīng)于cc中的lenJString對應(yīng)于java中的String通過查看jni.h可以看到這些數(shù)據(jù)類型其實(shí)都是根據(jù)java和cc中的數(shù)據(jù)類型對應(yīng)關(guān)系使用typedef關(guān)鍵字重新定義的基本數(shù)據(jù)類型或結(jié)構(gòu)體.具體的對應(yīng)關(guān)系如下:Java類型本地類型描述booleanjbooleanCC8位整型byte

11、jbyteCC帶符號的8位整型jCC無符號的16位整型shtjshtCC帶符號的16位整型intjintCC帶符號的32位整型longjlongCC帶符號的64位整型efloatjfloatCC32位浮點(diǎn)型doublejdoubleCC64位浮點(diǎn)型Objectjobject任何Java對象或者沒有對應(yīng)java類型的對象ClassjclassClass對象Stringjstring字符串對象Object[]jobjectArray任何對象

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論