王宏浩 富強(qiáng) 徐東晨
摘要:隨著時(shí)代的發(fā)展和科技的進(jìn)步,Internet技術(shù)也得到了快速的發(fā)展。在這樣的條件下,java語言以其所獨(dú)有的特點(diǎn),被廣泛應(yīng)用于多種設(shè)備、網(wǎng)絡(luò)和計(jì)算機(jī)中。盡管java可以跨平臺(tái),具有良好的可移植性,但是PC機(jī)上,尤其是WINDOWS系統(tǒng)下,要通過java實(shí)現(xiàn)對(duì)系統(tǒng)文件的調(diào)用則較為困難。論文結(jié)合筆者研究,闡述了如何利用已經(jīng)寫好的FATFS文件系統(tǒng)C代碼,在JNI技術(shù)基礎(chǔ)上實(shí)現(xiàn)PC機(jī)上文件系統(tǒng)功能的調(diào)用。
關(guān)鍵詞:SOA;文件系統(tǒng);JNI;讀文件;寫文件1JNI技術(shù)
使用JNI技術(shù)的最終目的就是為了能夠在完成編寫頭文件和本地程序的基礎(chǔ)上,再借助C/C++文件生成一個(gè)動(dòng)態(tài)庫文件,然后將其加載至Java程序中,確保其成功運(yùn)行。具體步驟可以分為以下五步:第一,構(gòu)建Java工程,編寫相應(yīng)的Java代碼。在這一環(huán)節(jié)中,首要任務(wù)是將需要定義的動(dòng)態(tài)庫名稱加載至Java類中,并且需要確定本地方法。第二,編寫并執(zhí)行.bat文件,從而生成與Java代碼相對(duì)應(yīng)的頭文件。第三,編寫本地代碼,以保證Java可以與C/C++數(shù)據(jù)文件之間的相互轉(zhuǎn)換。第四,編譯本地代碼,從而生成DLL或者.SO文件。第五,加載已生成的動(dòng)態(tài)庫文件至Java代碼之內(nèi),并將Java程序運(yùn)行。
2SOA三層構(gòu)架下FATFS文件系統(tǒng)的移植
SOA即Service-Oriented Architecture,是面向服務(wù)的體系結(jié)構(gòu),它的出現(xiàn)解決了如何提高系統(tǒng)的擴(kuò)展性的問題。通過SOA的三層構(gòu)架,有效的解決了諸多問題。這可以從兩個(gè)方面分析,即邏輯層的SOA三層構(gòu)架以及實(shí)現(xiàn)層SOA三層構(gòu)架。
2.1 邏輯層SOA三層構(gòu)架
邏輯層SOA三層構(gòu)架的主要作用就是確保業(yè)務(wù)需求與系統(tǒng)的分離。根據(jù)不同的應(yīng)用方式,SOA可以實(shí)現(xiàn)不同語義層定義相應(yīng)的應(yīng)用協(xié)議語言。這樣就可以實(shí)現(xiàn)針對(duì)特定應(yīng)用系統(tǒng)的系統(tǒng)需求映射,從而達(dá)到將業(yè)務(wù)需求與系統(tǒng)之間的銜接的目的。邏輯層SOA三層構(gòu)架是針對(duì)FATFS文件系統(tǒng)之間的底層驅(qū)動(dòng)函數(shù)。一般來說FATFS文件系統(tǒng)有六個(gè)接口函數(shù)與硬件層相對(duì)應(yīng),即磁盤初始化、獲取當(dāng)前磁盤的狀態(tài)、寫扇區(qū)、讀扇區(qū)、獲取當(dāng)前時(shí)間以及存儲(chǔ)介質(zhì)控制函數(shù)。
2.2 實(shí)現(xiàn)層SOA三層構(gòu)架
這與邏輯層SOA三層構(gòu)架相對(duì)應(yīng),引擎映射對(duì)應(yīng)概念模型需求層;流程映射對(duì)應(yīng)邏輯模型語義層;構(gòu)建映射對(duì)應(yīng)物理模型服務(wù)層。
因?yàn)檎撐膬?nèi)實(shí)現(xiàn)的PC機(jī)下Java對(duì)文件系統(tǒng)功能的調(diào)用是基于Java調(diào)用C而實(shí)現(xiàn)的,那么邏輯層SOA三層構(gòu)架內(nèi)的服務(wù)層之中的底層函數(shù)是與實(shí)現(xiàn)層的構(gòu)件池相對(duì)應(yīng)的,而實(shí)現(xiàn)層的引擎則是Java,這樣通過Java引擎就可以在調(diào)用文件系統(tǒng)流程的過程中生成的動(dòng)態(tài)庫文件達(dá)到實(shí)現(xiàn)文件系統(tǒng)的目的。
3PC機(jī)下Java對(duì)文件系統(tǒng)功能調(diào)用
通過對(duì)前面SOA三層構(gòu)架的分析,并在此基礎(chǔ)上實(shí)現(xiàn)了FATFS文件系統(tǒng)的移植,接下來就可以實(shí)現(xiàn)通過Java對(duì)PC機(jī)下文件系統(tǒng)功能的調(diào)用。為了便于實(shí)現(xiàn)和測(cè)試,筆者所采用的測(cè)試平臺(tái)為VC++以及eclipse平臺(tái)。具體實(shí)驗(yàn)流程如下所述:
第一步,構(gòu)建Java工程Rename,其中設(shè)置其包名為filesystem,類FileSystem。
第二步,在代碼FileSystem.java中聲明本地方法。
其中:①函數(shù)表示對(duì)文件的重命名,path_old表示文件名,而path_new則代表修改以后的文件名;
②函數(shù)則表示需要根據(jù)路徑來讀取相應(yīng)的文件夾,代碼String path文件夾;
③函數(shù)則代表按照path的路徑進(jìn)行文件數(shù)據(jù)的寫入;
④函數(shù)意為讀取相應(yīng)路徑內(nèi)的文件夾的內(nèi)容;
⑤函數(shù)表示讀取路徑寫文件的相關(guān)信息,諸如文件的創(chuàng)建時(shí)間等;
⑥函數(shù)指需要為path路徑創(chuàng)建一個(gè)文件夾;
⑦函數(shù)指將該路徑下文件夾的屬性改變。
第三步,加載動(dòng)態(tài)庫,其語句為
static
{
System.loadLibrary("renamel");
}
Renamel即表示動(dòng)態(tài)庫的名字,這樣Java就可以憑借調(diào)用上述中介DLL的方式,間接地達(dá)到調(diào)用真正第三方DLL的目的。
第四步,通過編譯,從而生FileSystem.class文件。
第五步,編寫執(zhí)行.bat文件,這樣就可以生成與Java代碼相對(duì)應(yīng)的頭文件,即filesystem_FileSystem.h。
第六步,通過VC6.0編譯器,就能夠生成renamel.dll文件。
這樣一來就實(shí)現(xiàn)了在PC機(jī)下Java對(duì)文件系統(tǒng)功能的調(diào)用。
4結(jié)語
綜上所述,在PC機(jī)下實(shí)現(xiàn)Java對(duì)文件系統(tǒng)功能的調(diào)用是一個(gè)復(fù)雜的過程,需要涉及到眾多方面。而JNI技術(shù)保障這一功能實(shí)現(xiàn)的前提。為了實(shí)現(xiàn)這一目的,就必須了解和掌握J(rèn)NI技術(shù)需要的軟件和平臺(tái),并在此基礎(chǔ)上分析FATFS文件系統(tǒng)的結(jié)構(gòu)基礎(chǔ),并最終借助SOA的三層構(gòu)架實(shí)現(xiàn)對(duì)PC上的FATFS系統(tǒng)文件的移植。最后,憑借JNI技術(shù),即可實(shí)現(xiàn)WINDOWS系統(tǒng)下Java對(duì)文件系統(tǒng)功能的調(diào)用。
[參考文獻(xiàn)]
[1]常青,張剛,王耀力.SOA三層構(gòu)架在嵌入式文件系統(tǒng)上的實(shí)現(xiàn)[J].太原理工大學(xué)學(xué)報(bào),2011(03).