ikvm.net 深入敵營的 java

57
IKVM.NET 深深深深深 Java 深深深 深深深深深深 深深深深深深 [email protected]

Upload: -

Post on 25-Jun-2015

2.713 views

Category:

Technology


8 download

DESCRIPTION

簡介 .NET 和 Java 之間交互運行的 iKVM.NET

TRANSCRIPT

Page 1: IKVM.NET 深入敵營的 Java

IKVM.NET

深入敵營的 Java王建興國立清華大學,資訊工程學系

[email protected]

Page 2: IKVM.NET 深入敵營的 Java

>個人簡介>IKVM.NET 應用>IKVM.NET 簡介>Java 與 .NET 之間的互換性

Page 3: IKVM.NET 深入敵營的 Java

3

個人簡介• 研究興趣

– Distributed Network Management System– Mobile Code System & Mobile Agent– P2P Networking

• 開發興趣– Java-based Application– Multimedia Streaming– P2P VoIP

Page 4: IKVM.NET 深入敵營的 Java

4

讓我們先來看一段” Java” 程式碼…

Page 5: IKVM.NET 深入敵營的 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)

Page 6: IKVM.NET 深入敵營的 Java

6

一次編寫,隨處運行

無處不在的 Java

包括 .NET!

Page 7: IKVM.NET 深入敵營的 Java

7

IKVM.NET

• IKVM.NET 是可執行於 .Net 平台的 Java 實作– Mono– Microsoft .Net Framework

• 目標– 在 .NET 上直接執行既有的 Java 應用程式– 將 Java byte code 轉換成 .NET assemblies

Page 8: IKVM.NET 深入敵營的 Java

8

IKVM.NET 系統架構 : JVM 觀點

.NETIKVM.NET

Java Class Java Class Java Class

Windows Linux

Page 9: IKVM.NET 深入敵營的 Java

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

Page 10: IKVM.NET 深入敵營的 Java

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 )

Page 11: IKVM.NET 深入敵營的 Java

11

GNU Classpath

• FREE 的 Java class library

• 為許多 Projects 採用

Page 12: IKVM.NET 深入敵營的 Java

12

GNU Classpath in .NET

Page 13: IKVM.NET 深入敵營的 Java

13

IKVM.NET 的應用方式• 動態模式:做為 .NET 上的 JVM 使用

– 可直接載入 .class 檔或 .jar 檔執行• 靜態模式:將 Java 程式轉換成為 .NET 執

行檔或程式庫– 直接在 .NET 平台上執行轉換好的 Java 程式– 於 .NET 程式中呼叫 Java 程式庫

• 所以我們有了 Java 和 .NET 的 Interoperability!

• 用 Java 寫 .NET– 以 Java 原始碼開發 .NET 應用程式

Page 14: IKVM.NET 深入敵營的 Java

14

IKVM.NET 的應用利基• .NET 上提供多種語言,但就是缺乏 Java

• 借力使力,四海之內皆 Java

• 即便在只有 .NET 的平台上,都能夠執行 Java

• 一次編寫,隨處運行:包括 .NET!

Page 15: IKVM.NET 深入敵營的 Java

15

IKVM.NET 的應用實例 (1/5)

• Lucene 是個 Java 社群極負盛名的全文搜尋引擎

• 有許多的專案,都嘗試著努力將 Lucene 移植至 .NET 平台– NLucene– Lucene.NET– SearchBlackBox ( Commercialized )– dotLucene

Page 16: IKVM.NET 深入敵營的 Java

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

Page 17: IKVM.NET 深入敵營的 Java

17

IKVM.NET 的應用實例 (3/5)

IKVM.NET Runtime

轉換 Lucene 所得

Page 18: IKVM.NET 深入敵營的 Java

18

IKVM.NET 的應用實例 (4/5)

Page 19: IKVM.NET 深入敵營的 Java

19

IKVM.NET 的應用實例 (5/5)

Page 20: IKVM.NET 深入敵營的 Java

20

作者• 主要由 Jeroen Frijters 及其開發團隊貢獻

– http://weblog.ikvm.net/– [email protected]

Page 21: IKVM.NET 深入敵營的 Java

21

系統需求• Microsoft .NET Framework 1.1 SDK (Wind

ows 平台 )

• Mono Framework 1.0 (Windows 或 Linux)

Page 22: IKVM.NET 深入敵營的 Java

22

下載• IKVM.NET on SourceForge

– http://sourceforge.net/projects/ikvm/

Page 23: IKVM.NET 深入敵營的 Java

23

安裝 – UnZip 即可

Page 24: IKVM.NET 深入敵營的 Java

24

基本上毋需設定binaries 都在 bin 目錄下

Page 25: IKVM.NET 深入敵營的 Java

25

但如果想偷懶的話…• 請將相關的 DLL 安裝於 Global Assembly

Cache– [ 控制台 ]/[ 系統管理工具 ]/[Microsoft .NET Fra

mework 1.1 組態 ]• [ 我的電腦 ]/[ 組件快取 ]

• 最小安裝– IKVM.GNU.Classpath.dll– IKVM.Runtime.dll

Page 26: IKVM.NET 深入敵營的 Java

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

Page 27: IKVM.NET 深入敵營的 Java

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

Page 28: IKVM.NET 深入敵營的 Java

28

IKVM.GNU.Classpath.dll

• GNU Classpath 的已編譯版本– 加上 IKVM.NET 額外的程式碼

• GNU Classpath 非 IKVM.NET 的一部份

Page 29: IKVM.NET 深入敵營的 Java

29

IKVM.JNI.CLR-Win32.dll

• 實作 JNI 介面的 Managed C++ assembly

• 選用– 僅有在應用程式動用原生程式庫時方才需要

• 純 Java 應用程式毋需使用• For Linux

– IKVM.JNI.Mono.dll

Page 30: IKVM.NET 深入敵營的 Java

30

IKVM.AWT.WinForms.dll

• 提供部份 AWT peers 的實作• 作者認為優先序較低的一個項目

Page 31: IKVM.NET 深入敵營的 Java

31

ikvm.exe

• IKVM.NET 的 VM 啟動程式• 相當於 java.exe

• 動態模式採用

Page 32: IKVM.NET 深入敵營的 Java

32

ikvmc.exe

• 將 .class 或 .jar 檔編譯成為 .NET assembly– .exe ( console 或視窗)– .dll ( library )– .netmodule ( .NET 程式模組)

• 靜態模式採用• 提供 .NET -> Java 的 Interoperability

Page 33: IKVM.NET 深入敵營的 Java

33

ikvmstub.exe

• 針對指定的 Assembly ,產生相對應的 jar檔

• jar 檔內含 Java 版本的 interfaces 及 stub類別

• 允許 Java 程式在 IKVM.NET 上使用 .NET類別

• 提供 Java -> .NET 的 InteroperabilityJava Class .NET ClassStub

Page 34: IKVM.NET 深入敵營的 Java

34

相容性與支援性• 與 JDK1.4大部份相容• AWT/SWING支援不足• 安全性機制仍有待加強

Page 35: IKVM.NET 深入敵營的 Java

35

japitools

• Java API 相容性測試工具組• 用途有二

–測試 FREE 的 Java 實作對 Sun JDK 的相容性–測試任意版本 API 的回溯相容性

• http://www.kaffe.org/~stuart/japi/

Page 36: IKVM.NET 深入敵營的 Java

36

GNU Classpath vs. JDK 1.4

Page 37: IKVM.NET 深入敵營的 Java

37

GNU Classpath vs. JDK 1.5

java.util.concurrent

Page 38: IKVM.NET 深入敵營的 Java

38

IKVM.NET Virtual Machine

• Usage– ikvm [ options ] classname [ args ... ] – ikvm [ options ] -jar jarfile [ args ... ]

• Options– -classpath classpath

Page 39: IKVM.NET 深入敵營的 Java

39

IKVM.NET Bytecode Compiler

• Usage– ikvmc [ options ] classOrJarfile [ classOrJarfile ... ]

• Options– -out:outputfile – -assembly:assembly-name – -target:target-type – -main:classname – -reference:library-filespec

Page 40: IKVM.NET 深入敵營的 Java

40

Target Type

• -target:exe– console 應用程式

• -target:winexe– 視窗應用程式

• -target:library

• -target:module– .netmodule

Page 41: IKVM.NET 深入敵營的 Java

41

Main Class

• -main:<class>

• 指定含有 main method 的類別名稱• 產生 console 或視窗應用程式時需指定

Page 42: IKVM.NET 深入敵營的 Java

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)

Page 43: IKVM.NET 深入敵營的 Java

43

IKVM.NET Stub Generator

• Usage– ikvmstub assemblyNameOrPath

Page 44: IKVM.NET 深入敵營的 Java

44

ikvmstub 執行範例• ikvm-0.28.0.0\bin\ikvmstub C:\WINDOWS\Microsoft.NET\

Framework\v1.1.4322\System.dll

System.Net.Sockets.TcpClient

Page 45: IKVM.NET 深入敵營的 Java

45

借力使力的 JVM

• 雖然邏輯上– 我們可以用 VM 觀點來看 IKVM.NET

• 但…– 轉換器觀點才是這個 JVM巧妙的設計所在

• 優點–省去開發一個完整 VM 的時間與精力–避免 VM 重重相疊的效能耗損

Page 46: IKVM.NET 深入敵營的 Java

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* 重探轉換器觀點

Page 47: IKVM.NET 深入敵營的 Java

47

Class Loading 的重要類別• IKVM.Internal.ClassFile

– BigEndianBinaryReader– ConstantPoolItem

• IKVM.Internal.ClassLoaderWrapper

• IKVM.Internal.TypeWrapper

Page 48: IKVM.NET 深入敵營的 Java

48

defineClass()

• ClassLoaderWrapper 的責任之一在提供 defineClass()

• ClassLoaderWrapper會為每個要載入的 class 建立相對應的 TypeWrapper

• TypeWrapper 提供了– CreateStep1()– CreateStep2NoFail()

Page 49: IKVM.NET 深入敵營的 Java

49

TypeWrapper

• CreateStep1()– 建立對應的 MethodWrapper, FieldWrapper

• CreateStep2()– 利用 System.Reflection.Emit.TypeBuilder 動態

的生成 .NET 上的類別

Page 50: IKVM.NET 深入敵營的 Java

50

Object Model Mapping

• 將 Java 的物件模型對映至 .NET–保持 .NET 與 Java 的互換性–保持足夠的效能– 實作單純化

Page 51: IKVM.NET 深入敵營的 Java

51

Object Model Mapping

Page 52: IKVM.NET 深入敵營的 Java

52

Mixed Model

http://weblog.ikvm.net/PermaLink.aspx?guid=c16bd06c-1c46-4255-a05f-6625cae7d816

Page 53: IKVM.NET 深入敵營的 Java

53

Java 與 .NET 的互換性• 在 .NET 程式中可以直接使用 Java library

• 以 IKVM.NET 為平台時, Java 程式可以透過 Stub 類別來呼叫 .NET 的 classes

Page 54: IKVM.NET 深入敵營的 Java

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骨

Page 55: IKVM.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());

}}

Page 56: IKVM.NET 深入敵營的 Java

56

Resources

• 官方首頁– http://www.ikvm.net/

• 作者部落格– http://weblog.ikvm.net/

Page 57: IKVM.NET 深入敵營的 Java

Thank you!

王建興[email protected]

http://blog.qing.tw