IKVM.NET 深入敵營的 Java

3,103
-1

Published on

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

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,103
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
40
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide
  • Visual J#
  • 有許多的專案,都嘗試著努力將 Lucene 移植至 .NET 平台,照我說,為什麼要移植呢? 我們可以用真正純正血統的原 Java 專案
  • IKVM.NET 深入敵營的 Java

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

      Clipping is a handy way to collect important slides you want to go back to later.

    ×