一介紹
IKVMNET是一個針對Mono和微軟net框架的java實現其設計目的是在NET平台上運行java程序它包含了以下的組建* 一個用NET實現的java虛擬機* 一個java類庫的NET實現* 致力於在java和NET之間交互的工具
二IKVMNET的組件
IKVMNET包含以下的部分* IKVMRuntimedll VM運行時和所有支持代碼它包括以下的功能Byte Code JIT 編譯器和驗證器 使用JIT將Java Byte Code編譯為CIL(C中間語言)
對象模式映射結構 將NET中的SystemObjectSystemStringSystemException映射為java代碼中的javalangObject javalangStringjavalangThrowable管理本地方法(在Classpath中)的NET重新實現
* IKVMGNUClasspathdll 被編譯的GNU Classpath版本它是由自由軟件基金會實現的java類庫和一些IKVMNET附加代碼組成的注意這裡的GNU Classpath不是IKVMNET的一部分但是前者被用在IKVMNET中
* IKVMJNI[Mono|CLRWin]dll 通過實現JNI接口管理C++匯編作為一個可選部分只在程序使用自己的本地庫時才被用到而對於純java程序來講是不會被用到的
* ikvmexe 與javaexe很類似的啟動執行程序(動態模式)
* ikvmcexe 靜態編譯器被用來編譯java類和jar使其成為NET匯編(靜態模式)
* ikvmstubexe 一個從NET匯編生成存根類的工具就如javap一樣反編譯NET匯編IKVMNET了解如何存根並用實際的NET類型引用替換對存根的引用
* IKVMAWTWinFormsdll 非常有限的零散AWT實現
二項目狀態
此項目目前正在開發將最大化實現與JDK的兼容但是仍存在一些漏洞(尤其在Classpth API中)
* AWT和Swing還未有功能
* 安全性是IKVM平台的一個大遺漏此問題將依靠NET平台提供的舊有的但功能強大的安全模式而被解決 雖然這樣目前項目已具備能成功運行大型java項目的能力
三IKVM原理
如何替換JVM IKVM應用包含了采用NET實現的java虛擬機在一些場合我們可以用它替換掉java例如 java jar myappjar 將被替換為 ikvm jar myappjar
在NET應用中使用java類庫IKVMNET包含ikvmc這個在java bytecode與NET中間語言的轉換器如果我們使用一個被用在NET平台的java庫的話 運行ikvmc –targetlibrary mylibjar(mylibjar在這裡指代我們的jar文件)來生成mylibdll例如apache FOP項目是一個開源的XSLFO處理器項目它使用java語言編寫的用於從xml生成PDF文檔使用IKVMNET技術我們可以將apache FOP用在任何的NET應用中這樣在開發NET應用的同時利用IKVM便可以使用java開源項目這個免費的軟件倉庫盡管在IKVMNET沒有提供在NET中使用的java編譯器但是我們可用開源的Jikes編譯器將java源代碼編譯為JVM bytecode然後使用ikvmc –targetexe myappjar來生產NET執行文件我們甚至可以通過包含ikvmstub應用的方式在我們的java代碼中用NET API
四IKVM使用入門
系統准備Windows平台Microsoft NET Framework SDK Windows或者Linux平台Mono Framework
開始安裝在Windows和Linux平台上安裝過程是相同的在下載二進制發布版後將文件解壓縮打開命令或者shell窗口cd進入ikvm\bin目錄執行ikvm如果我們操作正確的話我們將看到以下的輸出
usage ikvm [options] <class> [args……] (to execute a class) or ikvm jar [options] <jarfile> [args……] (to execute a jar file) ……
為了方便使用我們可將ikvm\bin目錄加入到系統path現在我們將使用IKVM就像使用JVM一樣並不需要配置如果我們需要在NET或者Mono環境下使用IKVM請仔細閱讀下面的文字說明* 首先下載Jikes編譯器如果我們計劃開發在java中開發代碼 運行於NET環境的話我們將要一個java編譯器IKVMNET沒有提供這個編譯器所以我們需要能生成標准java類文件的編譯器Jlikes是一個好選擇它是一個優秀的開源項目並應用在多種平台當然Sun提供的jdk也很好
* 在Windows的全局匯編緩沖區中安裝IKVM dll在Windows中運行基於IKVM dll的NET應用程序時NET框架必須定位這些dll的位置系統首先在全局匯編緩沖區中查找然後再當前目錄中查找如果我們想不在當前目錄中安裝這些dll文件的話我們就要將它們安裝在全局匯編緩沖區中在Windows控制面板中訪問NET框架配置增加一個匯編緩沖區我們至少要安裝IKVMGNUClasspathdll和IKVMRuntimedll
設置環境在我們開始編寫代碼之前需要准備一下我們的環境添加以下路徑到系統PATH環境變量中* 包含IKVM執行文件的目錄
* 包含C#編譯器(在Windows/Mono中為csc)的目錄通常在Windows中為C\WINDOWS\MicrosoftNET\Framework\v * 包含java編譯器(javac或者jikes)的目錄
動態執行java應用程序IKVMNET包括了一個C#實現的java虛擬機我們可以從一個例子開始——進入IKVMROOT\samples\hello目錄編譯示例程序
Javac Hello jar cfm hellojar manifestmf Helloclass
現在在使用javac編譯了Hello類後我們使用IKVM運行此類
ikvm Hello
這個命令將啟動IKVMIKVM查找名為Helloclass的文件如果找到則將其裝載並動態執行bytecode此時Hello程序將要求我們輸入名字之後我們將看到一個問候信息
如果在上面的過程中發生問題請檢查下面的地方* 檢查命令行 ikvm像java一樣需要我們輸入正確的類名
* 如果ikvm報告ClassNotFoundException請檢查CLASSPATH環境變量是否被設置如果被設置請清除CLASSPATH或者將當前目錄加入到CLASSPATH中以使ikvm能夠在當前目錄中找到類
如果運行jar文件我們可鍵入
ikvm jar hellojar
提示詳細的命令行選項可以參考ikvm手冊
將java程序轉換為NET程序IKVMNET包含ikvmc這個能夠將jar文件轉換為NET的dll庫文件和exe應用的工具下面我們將學習如何將java應用轉換為一個NET執行文件進入IKVMROOT\samples\hello目錄輸入以下命令
ikvmc hellojar
注意當我們使用Mono時我們需要告訴ikvmc如何找到GNU Classpath dll例如
ikvmc reference/usr/lib/IKVMGNUClasspathdll hellojar
在命令執行完後我們將發現helloexe已被生成在當前目錄* 在Windows/NET環境下如果我們得到了FileNotFound的異常請記住檢查NET框架希望在當前目錄或是全局匯編緩沖區中尋找dll文件我們可以通過上面講的方法將dll安裝到全局匯編緩沖區中或者將dll文件直接復制到當前目錄
* 在Linux/Mono環境下我們使用下面的命令執行helloexe
mono helloexe
在java中開發NET應用首先進入IKVMROOT\samples\usenetapi目錄找到ShowDirjava文件這個java應用使用了NET API來顯示當前目錄下的文件列表打開這個文件我們會發現其導入的包名以cli開頭這些並不是java API包它們是映射到NET命名空間的偽包需要查看更多信息請看IKVM的開發者手冊
第一步生成java存根文件IKVM沒有提供java編譯器所以我們可以使用標准的java編譯器由於java編譯器只能編譯使用了java API的應用程序而不是使用NET API的應用所以我們在這裡需要愚弄一下java編譯器使其相信名為cliSystemIO的包是一個真正的java包幫助我們完成這項工作的是ikvmstub程序它從NET dll生成jar文件這個被生成的jar文件包含了與NET類對應的java類和接口但是並不包含真正的代碼只包含一些映射信息這樣做便會通過java編譯器的檢查和編譯
ikvmstub mscorlibdll
注意在Linux Mono環境下我們必須輸入dll文件的完整路徑例如
ikvmstub /usr/lib/mscorlibdll
在編譯完成後我們將在當前目錄下發現一個名為mscorlibjar的文件
第二步編譯java源代碼現在我們將編譯java源代碼如果使用javac的話可輸入以下命令javac classpath mscorlibjar ShowDirjava
在命令完成後ShowDirclass文件將出現當前目錄下
第三步生成NET執行文件最後我們將轉換java class文件為NET應用程序正如前面講的ikvmc ShowDirclass
注意在Linux Mono環境下我們需要使用前面提到的reference選項
ikvmc reference/usr/lib/IKVMGNUClasspathdll ShowDirclass
這時我們便可以看到ShowDirexe出現在當前目錄
五參考資源
From:http://tw.wingwit.com/Article/program/net/201311/11807.html