Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

IKVM.NET 深入敵營的 Java

4,403 views

Published on

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

Published in: Technology
  • Be the first to comment

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

×