国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

在.NET平臺(tái)運(yùn)行Java程序-IKVM.NET入門

2024-07-10 13:12:00
字體:
供稿:網(wǎng)友
摘要

  ikvm.net是一個(gè)針對(duì)mono和微軟.net框架的java實(shí)現(xiàn),其設(shè)計(jì)目的是在.net平臺(tái)上運(yùn)行java程序。本文將比較詳細(xì)的介紹這個(gè)工具的原理、使用入門(如何java應(yīng)用轉(zhuǎn)換為.net應(yīng)用、如何在java中開發(fā).net應(yīng)用),希望能給大家?guī)眢@喜。

一、介紹

  ikvm.net是一個(gè)針對(duì)mono和微軟.net框架的java實(shí)現(xiàn),其設(shè)計(jì)目的是在.net平臺(tái)上運(yùn)行java程序。它包含了以下的組建:
* 一個(gè)用.net實(shí)現(xiàn)的java虛擬機(jī)
* 一個(gè)java類庫的.net實(shí)現(xiàn)
* 致力于在java和.net之間交互的工具

二、ikvm.net的組件

  ikvm.net包含以下的部分:
* ikvm.runtime.dll: vm運(yùn)行時(shí)和所有支持代碼。它包括以下的功能:
   byte code jit 編譯器和驗(yàn)證器: 使用jit將java byte code編譯為cil(c中間語言)。
   對(duì)象模式映射結(jié)構(gòu): 將.net中的system.object,system.string,system.exception映射為java代碼中的java.lang.object, java.lang.string,java.lang.throwable。
   管理本地方法(在classpath中)的.net重新實(shí)現(xiàn)。
* ikvm.gnu.classpath.dll: 被編譯的gnu classpath版本,它是由自由軟件基金會(huì)實(shí)現(xiàn)的java類庫和一些ikvm.net附加代碼組成的。注意:這里的gnu classpath不是ikvm.net的一部分,但是前者被用在ik.vm.net中。
* ikvm.jni.[mono|clr-win32].dll: 通過實(shí)現(xiàn)jni接口管理c++匯編。作為一個(gè)可選部分,只在程序使用自己的本地庫時(shí)才被用到。而對(duì)于純java程序來講是不會(huì)被用到的。
* ikvm.exe: 與java.exe很類似的啟動(dòng)執(zhí)行程序(動(dòng)態(tài)模式)。
* ikvmc.exe: 靜態(tài)編譯器,被用來編譯java類和jar使其成為.net匯編(靜態(tài)模式)。
* ikvmstub.exe: 一個(gè)從.net匯編生成存根類的工具,就如javap一樣反編譯.net匯編。ikvm.net了解如何存根并用實(shí)際的.net類型引用替換對(duì)存根的引用。
* ikvm.awt.winforms.dll: 非常有限的零散awt實(shí)現(xiàn)。

二、項(xiàng)目狀態(tài)

  此項(xiàng)目目前正在開發(fā),將最大化實(shí)現(xiàn)與jdk1.4的兼容,但是仍存在一些漏洞(尤其在classpth api中)。
* awt和swing還未有功能。
* 安全性是ikvm平臺(tái)的一個(gè)大遺漏。此問題將依靠.net平臺(tái)提供的舊有的、但功能強(qiáng)大的安全模式而被解決。 雖然這樣,目前項(xiàng)目已具備能成功運(yùn)行大型java項(xiàng)目的能力。

三、ikvm原理

1.如何替換jvm

  ikvm應(yīng)用包含了采用.net實(shí)現(xiàn)的java虛擬機(jī)。在一些場(chǎng)合,我們可以用它替換掉java。例如: java -jar myapp.jar 將被替換為 ikvm -jar myapp.jar。

2.在.net應(yīng)用中使用java類庫

  ikvm.net包含ikvmc,這個(gè)在java bytecode與.net中間語言的轉(zhuǎn)換器。如果我們使用一個(gè)被用在.net平臺(tái)的java庫的話, 運(yùn)行ikvmc –target:library mylib.jar(mylib.jar在這里指代我們的jar文件)來生成mylib.dll。例如apache fop項(xiàng)目是一個(gè)開源的xsl-fo處理器項(xiàng)目,它使用java語言編寫的用于從xml生成pdf文檔。使用ikvm.net技術(shù),我們可以將apache fop用在任何的.net應(yīng)用中。這樣在開發(fā).net應(yīng)用的同時(shí)利用ikvm便可以使用java開源項(xiàng)目這個(gè)免費(fèi)的軟件倉庫。盡管在ikvm.net沒有提供在.net中使用的java編譯器,但是我們可用開源的jikes編譯器將java源代碼編譯為jvm bytecode,然后使用ikvmc –target:exe myapp.jar來生產(chǎn).net執(zhí)行文件。我們甚至可以通過包含ikvmstub應(yīng)用的方式在我們的java代碼中用.net api。

四、ikvm使用入門

1.系統(tǒng)準(zhǔn)備

windows平臺(tái):microsoft .net framework 1.1 sdk
windows或者linux平臺(tái):mono framework 1.0

2.開始安裝

  在windows和linux平臺(tái)上安裝過程是相同的,在下載二進(jìn)制發(fā)布版后,將文件解壓縮。打開命令或者shell窗口,cd進(jìn)入ikvm/bin目錄,執(zhí)行ikvm。如果我們操作正確的話,我們將看到以下的輸出:

usage: ikvm [-options] <class> [args...] (to execute a class) or ikvm -jar [-options] <jarfile> [args...] (to execute a jar file) ...

  為了方便使用,我們可將ikvm/bin目錄加入到系統(tǒng)path。現(xiàn)在我們將使用ikvm就像使用jvm一樣,并不需要配置。如果我們需要在.net或者mono環(huán)境下使用ikvm,請(qǐng)仔細(xì)閱讀下面的文字說明:

* 首先下載jikes編譯器。如果我們計(jì)劃開發(fā)在java中開發(fā)代碼 運(yùn)行于.net環(huán)境的話,我們將要一個(gè)java編譯器。ikvm.net沒有提供這個(gè)編譯器,所以我們需要能生成標(biāo)準(zhǔn)java類文件的編譯器。jlikes是一個(gè)好選擇,它是一個(gè)優(yōu)秀的開源項(xiàng)目,并應(yīng)用在多種平臺(tái)。當(dāng)然sun提供的jdk也很好。

* 在windows的全局匯編緩沖區(qū)中安裝ikvm dll。在windows中運(yùn)行基于ikvm dll的.net應(yīng)用程序時(shí),.net框架必須定位這些dll的位置。系統(tǒng)首先在全局匯編緩沖區(qū)中查找,然后再當(dāng)前目錄中查找。如果我們想不在當(dāng)前目錄中安裝這些dll文件的話,我們就要將它們安裝在全局匯編緩沖區(qū)中:在windows控制面板中訪問.net框架配置,增加一個(gè)匯編緩沖區(qū)。我們至少要安裝ikvm.gnu.classpath.dll和ikvm.runtime.dll。

3.設(shè)置環(huán)境

  在我們開始編寫代碼之前需要準(zhǔn)備一下我們的環(huán)境,添加以下路徑到系統(tǒng)path環(huán)境變量中:
* 包含ikvm執(zhí)行文件的目錄。
* 包含c#編譯器(在windows/mono中為csc)的目錄,通常在windows中為c:/windows/microsoft.net/framework/v1.1.4322。
* 包含java編譯器(javac或者jikes)的目錄。

4.動(dòng)態(tài)執(zhí)行java應(yīng)用程序

  ikvm.net包括了一個(gè)c#實(shí)現(xiàn)的java虛擬機(jī)。我們可以從一個(gè)例子開始——進(jìn)入ikvmroot/samples/hello目錄,編譯示例程序:

javac hello jar cfm hello.jar manifest.mf hello.class

  現(xiàn)在,在使用javac編譯了hello類后,我們使用ikvm運(yùn)行此類:

ikvm hello

  這個(gè)命令將啟動(dòng)ikvm,ikvm查找名為hello.class的文件。如果找到,則將其裝載并動(dòng)態(tài)執(zhí)行bytecode。此時(shí)hello程序?qū)⒁笪覀冚斎朊郑笪覀儗⒖吹揭粋€(gè)問候信息。

  如果在上面的過程中發(fā)生問題,請(qǐng)檢查下面的地方:
* 檢查命令行: ikvm像java一樣需要我們輸入正確的類名。
* 如果ikvm報(bào)告classnotfoundexception,請(qǐng)檢查classpath環(huán)境變量是否被設(shè)置。如果被設(shè)置,請(qǐng)清除classpath或者將當(dāng)前目錄加入到classpath中以使ikvm能夠在當(dāng)前目錄中找到類。

如果運(yùn)行jar文件,我們可鍵入:

ikvm -jar hello.jar

提示:詳細(xì)的命令行選項(xiàng)可以參考ikvm手冊(cè)

5.將java程序轉(zhuǎn)換為.net程序

  ikvm.net包含ikvmc這個(gè)能夠?qū)ar文件轉(zhuǎn)換為.net的dll庫文件和exe應(yīng)用的工具。下面我們將學(xué)習(xí)如何將java應(yīng)用轉(zhuǎn)換為一個(gè).net執(zhí)行文件:

  進(jìn)入ikvmroot/samples/hello目錄輸入以下命令:

ikvmc hello.jar

  注意:當(dāng)我們使用mono時(shí),我們需要告訴ikvmc如何找到gnu classpath dll,例如:

  ikvmc -reference:/usr/lib/ikvm.gnu.classpath.dll hello.jar

  在命令執(zhí)行完后,我們將發(fā)現(xiàn)hello.exe已被生成在當(dāng)前目錄:
* 在windows/.net環(huán)境下,如果我們得到了filenotfound的異常,請(qǐng)記住檢查.net框架希望在當(dāng)前目錄或是全局匯編緩沖區(qū)中尋找dll文件。我們可以通過上面講的方法將dll安裝到全局匯編緩沖區(qū)中,或者將dll文件直接復(fù)制到當(dāng)前目錄。

* 在linux/mono環(huán)境下,我們使用下面的命令執(zhí)行hello.exe:

mono hello.exe

6.在java中開發(fā).net應(yīng)用

  首先進(jìn)入ikvmroot/samples/usenetapi目錄,找到showdir.java文件,這個(gè)java應(yīng)用使用了.net api來顯示當(dāng)前目錄下的文件列表。打開這個(gè)文件,我們會(huì)發(fā)現(xiàn)其導(dǎo)入的包名以cli開頭,這些并不是java api包,它們是映射到.net命名空間的“偽”包。需要查看更多信息請(qǐng)看ikvm的開發(fā)者手冊(cè)

第一步:生成java存根文件

  ikvm沒有提供java編譯器,所以我們可以使用標(biāo)準(zhǔn)的java編譯器。由于java編譯器只能編譯使用了java api的應(yīng)用程序,而不是使用.net api的應(yīng)用。所以我們?cè)谶@里需要“愚弄”一下java編譯器使其相信名為cli.system.io的包是一個(gè)真正的java包。幫助我們完成這項(xiàng)工作的是ikvmstub程序。它從.net dll生成jar文件,這個(gè)被生成的jar文件包含了與.net類對(duì)應(yīng)的java類和接口,但是并不包含真正的代碼,只包含一些映射信息。這樣做便會(huì)通過java編譯器的檢查和編譯:

ikvmstub mscorlib.dll

注意:在linux mono環(huán)境下,我們必須輸入dll文件的完整路徑,例如:
ikvmstub /usr/lib/mscorlib.dll

在編譯完成后,我們將在當(dāng)前目錄下發(fā)現(xiàn)一個(gè)名為mscorlib.jar的文件。

第二步:編譯java源代碼

現(xiàn)在我們將編譯java源代碼,如果使用javac的話,可輸入以下命令:

javac -classpath mscorlib.jar showdir.java

在命令完成后,showdir.class文件將出現(xiàn)當(dāng)前目錄下。

第三步:生成.net執(zhí)行文件

最后我們將轉(zhuǎn)換java class文件為.net應(yīng)用程序,正如前面講的:

ikvmc showdir.class

注意:在linux mono環(huán)境下,我們需要使用前面提到的-reference選項(xiàng):

ikvmc -reference:/usr/lib/ikvm.gnu.classpath.dll showdir.class

這時(shí)我們便可以看到showdir.exe出現(xiàn)在當(dāng)前目錄。

五、參考資源:
http://www.ikvm.net/
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 开封市| 儋州市| 霍山县| 土默特右旗| 威信县| 石景山区| 姚安县| 宜兰县| 沂南县| 峨眉山市| 临漳县| 兴义市| 古蔺县| 南澳县| 光山县| 高邑县| 威信县| 即墨市| 苍梧县| 洛隆县| 额尔古纳市| 永顺县| 五原县| 松滋市| 麦盖提县| 盐源县| 麻城市| 霍城县| 高尔夫| 理塘县| 牙克石市| 南平市| 新田县| 东阿县| 交城县| 资阳市| 松阳县| 淅川县| 曲麻莱县| 天台县| 天台县|