ikvm.net 深入敵營的 java
DESCRIPTION
簡介 .NET 和 Java 之間交互運行的 iKVM.NETTRANSCRIPT
>個人簡介>IKVM.NET 應用>IKVM.NET 簡介>Java 與 .NET 之間的互換性
3
個人簡介• 研究興趣
– Distributed Network Management System– Mobile Code System & Mobile Agent– P2P Networking
• 開發興趣– Java-based Application– Multimedia Streaming– P2P VoIP
4
讓我們先來看一段” Java” 程式碼…
5
{try{
FileReader fr = new FileReader("log.txt");BufferedReader br = new BufferedReader(fr);br.readLine();br.close();fr.close();
}catch(IOException e){
e.printStackTrace();}
}}
}
using System;using java.io;
namespace JavaCode{
class Class1{
[STAThread]static void Main(string[] args)
6
一次編寫,隨處運行
無處不在的 Java
包括 .NET!
7
IKVM.NET
• IKVM.NET 是可執行於 .Net 平台的 Java 實作– Mono– Microsoft .Net Framework
• 目標– 在 .NET 上直接執行既有的 Java 應用程式– 將 Java byte code 轉換成 .NET assemblies
8
IKVM.NET 系統架構 : JVM 觀點
.NETIKVM.NET
Java Class Java Class Java Class
Windows Linux
9
IKVM.NET 系統架構 : 轉換器觀點
.NET/Java core classes
.NETIK
VM
.NE
T
Java Class
Java Class
.NET Class
Windows Linux
Java Class.NET Class
.NET Class
10
什麼是 IKVM.NET
• IKVM.NET 是一個特殊化的 JVM– 它是一個 run 在另一個 VM ( .NET )之上的 J
VM
• IKVM.NET 提供了類別轉換器– 可以在 byte code 層次進行 Java byte code 與 .
NET CIL 之間的轉換• IKVM.NET 內含 Java core classes 的 .NET
實作( GNU Classpath )
11
GNU Classpath
• FREE 的 Java class library
• 為許多 Projects 採用
12
GNU Classpath in .NET
13
IKVM.NET 的應用方式• 動態模式:做為 .NET 上的 JVM 使用
– 可直接載入 .class 檔或 .jar 檔執行• 靜態模式:將 Java 程式轉換成為 .NET 執
行檔或程式庫– 直接在 .NET 平台上執行轉換好的 Java 程式– 於 .NET 程式中呼叫 Java 程式庫
• 所以我們有了 Java 和 .NET 的 Interoperability!
• 用 Java 寫 .NET– 以 Java 原始碼開發 .NET 應用程式
14
IKVM.NET 的應用利基• .NET 上提供多種語言,但就是缺乏 Java
• 借力使力,四海之內皆 Java
• 即便在只有 .NET 的平台上,都能夠執行 Java
• 一次編寫,隨處運行:包括 .NET!
15
IKVM.NET 的應用實例 (1/5)
• Lucene 是個 Java 社群極負盛名的全文搜尋引擎
• 有許多的專案,都嘗試著努力將 Lucene 移植至 .NET 平台– NLucene– Lucene.NET– SearchBlackBox ( Commercialized )– dotLucene
16
IKVM.NET 的應用實例 (2/5)
• 從 Lucene 中取出– lucene-core-2.0.0.jar– lucene-demos-2.0.0.jar
• Demo 利用動態模式建立索引檔– 執行 org.apache.lucene.demo.IndexFiles
• Demo 利用靜態模式進行查詢– 執行 org.apache.lucene.demo.SearchFiles
17
IKVM.NET 的應用實例 (3/5)
IKVM.NET Runtime
轉換 Lucene 所得
18
IKVM.NET 的應用實例 (4/5)
19
IKVM.NET 的應用實例 (5/5)
21
系統需求• Microsoft .NET Framework 1.1 SDK (Wind
ows 平台 )
• Mono Framework 1.0 (Windows 或 Linux)
22
下載• IKVM.NET on SourceForge
– http://sourceforge.net/projects/ikvm/
23
安裝 – UnZip 即可
24
基本上毋需設定binaries 都在 bin 目錄下
25
但如果想偷懶的話…• 請將相關的 DLL 安裝於 Global Assembly
Cache– [ 控制台 ]/[ 系統管理工具 ]/[Microsoft .NET Fra
mework 1.1 組態 ]• [ 我的電腦 ]/[ 組件快取 ]
• 最小安裝– IKVM.GNU.Classpath.dll– IKVM.Runtime.dll
26
重要組成• DLLs
– IKVM.Runtime.dll– IKVM.GNU.Classpath.dll– IKVM.JNI.CLR-Win32.dll– IKVM.AWT.WinForms.dll
• EXEs– ikvm.exe – ikvmc.exe – ikvmstub.exe
27
IKVM.Runtime.dll
• VM 的 runtime 及其他輔助程式碼,包括了– Byte Code JIT compiler/verifier – Object model remapping infrastructure– Managed .NET re-implementations of the nati
ve methods in Classpath
28
IKVM.GNU.Classpath.dll
• GNU Classpath 的已編譯版本– 加上 IKVM.NET 額外的程式碼
• GNU Classpath 非 IKVM.NET 的一部份
29
IKVM.JNI.CLR-Win32.dll
• 實作 JNI 介面的 Managed C++ assembly
• 選用– 僅有在應用程式動用原生程式庫時方才需要
• 純 Java 應用程式毋需使用• For Linux
– IKVM.JNI.Mono.dll
30
IKVM.AWT.WinForms.dll
• 提供部份 AWT peers 的實作• 作者認為優先序較低的一個項目
31
ikvm.exe
• IKVM.NET 的 VM 啟動程式• 相當於 java.exe
• 動態模式採用
32
ikvmc.exe
• 將 .class 或 .jar 檔編譯成為 .NET assembly– .exe ( console 或視窗)– .dll ( library )– .netmodule ( .NET 程式模組)
• 靜態模式採用• 提供 .NET -> Java 的 Interoperability
33
ikvmstub.exe
• 針對指定的 Assembly ,產生相對應的 jar檔
• jar 檔內含 Java 版本的 interfaces 及 stub類別
• 允許 Java 程式在 IKVM.NET 上使用 .NET類別
• 提供 Java -> .NET 的 InteroperabilityJava Class .NET ClassStub
34
相容性與支援性• 與 JDK1.4大部份相容• AWT/SWING支援不足• 安全性機制仍有待加強
35
japitools
• Java API 相容性測試工具組• 用途有二
–測試 FREE 的 Java 實作對 Sun JDK 的相容性–測試任意版本 API 的回溯相容性
• http://www.kaffe.org/~stuart/japi/
36
GNU Classpath vs. JDK 1.4
37
GNU Classpath vs. JDK 1.5
java.util.concurrent
38
IKVM.NET Virtual Machine
• Usage– ikvm [ options ] classname [ args ... ] – ikvm [ options ] -jar jarfile [ args ... ]
• Options– -classpath classpath
39
IKVM.NET Bytecode Compiler
• Usage– ikvmc [ options ] classOrJarfile [ classOrJarfile ... ]
• Options– -out:outputfile – -assembly:assembly-name – -target:target-type – -main:classname – -reference:library-filespec
40
Target Type
• -target:exe– console 應用程式
• -target:winexe– 視窗應用程式
• -target:library
• -target:module– .netmodule
41
Main Class
• -main:<class>
• 指定含有 main method 的類別名稱• 產生 console 或視窗應用程式時需指定
42
ikvmc 執行範例• ikvmc -out:lucene.dll -target:library lucene-core-2.0.0.jar
– 將 lucene核心的 jar 檔轉換成為 .NET assembly (.dll)
• ikvm-0.28.0.0\bin\ikvmc-out:SearchFiles.exe
-target:exe
-reference:lucene.dll
-main:org.apache.lucene.demo.SearchFiles
lucene-demos-2.0.0.jar – 將 lucene 的 demo 程式轉換成為 .NET assembly (.ex
e)
43
IKVM.NET Stub Generator
• Usage– ikvmstub assemblyNameOrPath
44
ikvmstub 執行範例• ikvm-0.28.0.0\bin\ikvmstub C:\WINDOWS\Microsoft.NET\
Framework\v1.1.4322\System.dll
System.Net.Sockets.TcpClient
45
借力使力的 JVM
• 雖然邏輯上– 我們可以用 VM 觀點來看 IKVM.NET
• 但…– 轉換器觀點才是這個 JVM巧妙的設計所在
• 優點–省去開發一個完整 VM 的時間與精力–避免 VM 重重相疊的效能耗損
46
IKVM.NET 借力使力的秘訣
.NET/Java core classes
.NETIK
VM
.NE
T
Java Class
Java Class
.NET Class
Windows Linux
Java Class.NET Class
.NET Class* 重探轉換器觀點
47
Class Loading 的重要類別• IKVM.Internal.ClassFile
– BigEndianBinaryReader– ConstantPoolItem
• IKVM.Internal.ClassLoaderWrapper
• IKVM.Internal.TypeWrapper
48
defineClass()
• ClassLoaderWrapper 的責任之一在提供 defineClass()
• ClassLoaderWrapper會為每個要載入的 class 建立相對應的 TypeWrapper
• TypeWrapper 提供了– CreateStep1()– CreateStep2NoFail()
49
TypeWrapper
• CreateStep1()– 建立對應的 MethodWrapper, FieldWrapper
• CreateStep2()– 利用 System.Reflection.Emit.TypeBuilder 動態
的生成 .NET 上的類別
50
Object Model Mapping
• 將 Java 的物件模型對映至 .NET–保持 .NET 與 Java 的互換性–保持足夠的效能– 實作單純化
51
Object Model Mapping
52
Mixed Model
http://weblog.ikvm.net/PermaLink.aspx?guid=c16bd06c-1c46-4255-a05f-6625cae7d816
53
Java 與 .NET 的互換性• 在 .NET 程式中可以直接使用 Java library
• 以 IKVM.NET 為平台時, Java 程式可以透過 Stub 類別來呼叫 .NET 的 classes
54
在 .NET 程式中直接使用 Java library [STAThread]
static void Main(string[] args){
String index = "index";String field = "contents";//IndexReader reader = IndexReader.open(index);//Searcher searcher = new IndexSearcher(reader);Analyzer analyzer = new StandardAnalyzer();//QueryParser parser = new QueryParser(field, analyzer);Query query = parser.parse("reduplication");//Hits hits = searcher.search(query);//for(int i=0;i<hits.length();i++){
Document doc = hits.doc(i);String path = doc.get("path");Console.WriteLine(path);
}}
.NET皮 Java骨
55
Java 程式呼叫 .NET 的 classes
import cli.System.*;import cli.System.Net.Sockets.TcpClient;
public class CallSystem{
public static void main(java.lang.String argv[]){
TcpClient tcpClient = new TcpClient();DateTime dt = new DateTime();System.out.println(dt.ToShortDateString());
}}
56
Resources
• 官方首頁– http://www.ikvm.net/
• 作者部落格– http://weblog.ikvm.net/