資源描述:
《Java通過JNI調(diào)用delphi程序》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、Java通過JNI調(diào)用delphi程序2008年03月25日星期二下午04:25調(diào)用Delphi程序通過在JNI框架內(nèi)實(shí)戰(zhàn)Java程序調(diào)用C程序,我們可以推導(dǎo)出Java程序基于JNI規(guī)范調(diào)用異質(zhì)語言編寫的程序的必要條件:—被調(diào)用的函數(shù)和方法被封裝在標(biāo)準(zhǔn)的動態(tài)鏈接庫中,由動態(tài)鏈接庫將其輸出。這是整個JNI規(guī)范存在的基礎(chǔ)?!趦煞N語言之間存在著一個充當(dāng)“翻譯”角色的中介。在Java調(diào)用C語言的場合中,這個中介就是jni.h:在開發(fā)被調(diào)用的動態(tài)鏈接庫的過程中,首先引入jni.h,然后實(shí)現(xiàn)利用javah生成的頭文件中定義的函數(shù)即可。以上是實(shí)踐JNI規(guī)范的必要條件。從中可以推導(dǎo)出以下的結(jié)論——任何語
2、言只要能滿足這兩個條件,那么這種語言就具備被Java程序調(diào)用的可能性。在Windows平臺上,主流開發(fā)語言都能編譯產(chǎn)生動態(tài)鏈接庫;但是能找到一種類似jni.h、在兩種異質(zhì)語言之間映射數(shù)據(jù)結(jié)構(gòu)的中介卻不是非常容易。本章介紹Java語言如何在JNI框架內(nèi)調(diào)用Delphi編譯產(chǎn)生的動態(tài)鏈接庫,在此過程中發(fā)揮類似jni.h作用的是jni.pas——同樣由Sun公司開發(fā),針對Delphi的JNI框架的實(shí)現(xiàn)。Delphi是誕生于Win32時代的一款優(yōu)秀的IDE,曾經(jīng)擁有龐大的開發(fā)群體。隨著Borland(相信本書的讀者對Borland公司不會陌生,不僅因?yàn)樗鼈髌姘愕墓适拢惨驗(yàn)樗牧硪豢钪鞔虍a(chǎn)品JBu
3、ilder)公司主營業(yè)務(wù)的轉(zhuǎn)型,也隨著Windows平臺從Win32時代向.NET時代的遷移,Delphi也正在經(jīng)歷著深刻的蛻變。盡管如此,Delphi仍然保持著一年一個大版本的升級速度。Delphi擁有眾多的成功案例,因此本書在介紹完Java和C語言的互操作之后,安排一節(jié)內(nèi)容介紹Java如何調(diào)用Delphi程序。本節(jié)涉及的Delphi程序在Delphi7.0環(huán)境下編譯通過。jni.pas在配書光盤中本節(jié)的源碼目錄中可以找到。15.3.1簡單例程在本章的順序編排方面,先以一個最簡單的例程“開場”,在這個例程中不涉及任何的參數(shù)傳遞,只要Java主調(diào)程序能夠觸發(fā)Delphi方法的執(zhí)行便達(dá)到目的
4、。Delphi基于ObjectPascal語言,Pascal語言的方法分為函數(shù)(Function)和過程(Procedure)兩類。我們先來看看做為主調(diào)方的Java程序。程序很簡單:在HelloWorld尋找并載入Project1.dll,并定義本地方法:displayHelloWorld()。代碼清單15-15調(diào)用Delphi函數(shù)的例程——HelloWorld1.??????publicclassHelloWorld2.??????{3.????????publicnativevoiddisplayHelloWorld();4.????????static5.????????{6.???
5、???????System.loadLibrary("Project1");7.????????}8.??????}Main則負(fù)責(zé)調(diào)用HelloWorld。代碼清單15-16調(diào)用Delphi函數(shù)的例程——Main1.??????publicclassMain2.??????{3.????????publicstaticvoidmain(String[]args)4.????????{5.??????????HelloWorldhw=newHelloWorld();6.??????????hw.displayHelloWorld();7.????????}8.??????}接下來的工作是編寫
6、Delphi程序。關(guān)于Delphi語法、Delphi工程的結(jié)構(gòu),以及如何在Delphi中開發(fā)動態(tài)鏈接庫,不準(zhǔn)備介紹,本書假設(shè)讀者們已經(jīng)掌握相關(guān)知識。以下是Delphi工程文件(.dpr文件)——在Delphi中如果不涉及任何窗體的話,是無須創(chuàng)建單元文件的。代碼清單15-17調(diào)用Delphi函數(shù)的例程——Project1.dpr1.??????libraryHelloWorldImpl;2.??????3.??????uses4.????????JNI;5.??????6.??????procedureJava_HelloWorld_displayHelloWorld(PEnv:PJNIEn
7、v;Obj:JObject);{$IFDEFWIN32}stdcall;{$ENDIF}{$IFDEFLINUX}cdecl;{$ENDIF}7.??????begin8.????????WriteLn('Helloworld!');9.??????end;10.???11.???exports12.?????Java_HelloWorld_displayHelloWorld;13.???14.???end.可以看到,在