IKVM.NET 深入敵營的 Java

  • 2,399 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,399
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
29
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

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

Transcript

  • 1. IKVM.NET 深入敵營的 Java 王建興 國立清華大學,資訊工程學系 [email_address]
  • 2.
    • 個人簡介
    • 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 觀點 .NET IKVM.NET Java Class Java Class Java Class Windows Linux
  • 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. 什麼是 IKVM.NET
    • IKVM.NET 是一個 特殊化 的 JVM
      • 它是一個 run 在另一個 VM ( .NET )之上的 JVM
    • 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)
  • 20. 作者
    • 主要由 Jeroen Frijters 及其開發團隊貢獻
      • http://weblog.ikvm.net/
      • [email_address]
  • 21. 系統需求
    • Microsoft .NET Framework 1.1 SDK (Windows 平台 )
    • 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 Framework 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 native 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 的 Interoperability
    Java Class .NET Class Stub
  • 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.0binikvmc
      • -out:SearchFiles.exe
      • -target:exe
      • -reference:lucene.dll
      • -main:org.apache.lucene.demo.SearchFiles
      • lucene-demos-2.0.0.jar
      • 將 lucene 的 demo 程式轉換成為 .NET assembly (.exe)
  • 43. IKVM.NET Stub Generator
    • Usage
      • ikvmstub assemblyNameOrPath
  • 44. ikvmstub 執行範例
    • ikvm-0.28.0.0binikvmstub C:WINDOWSMicrosoft.NETFrameworkv1.1.4322System.dll
    System.Net.Sockets.TcpClient
  • 45. 借力使力的 JVM
    • 雖然邏輯上
      • 我們可以用 VM 觀點來看 IKVM.NET
    • 但…
      • 轉換器觀點才是這個 JVM 巧妙的設計所在
    • 優點
      • 省去開發一個完整 VM 的時間與精力
      • 避免 VM 重重相疊的效能耗損
  • 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. 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 = &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. 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 /
  • 57. Thank you! 王建興 [email_address] http://blog.qing.tw