用IKVMC將jar轉成dll供c#調用


前言

實習到如今所須要的工具類給的都是jar包,可是我須要在.net環境下去實現,若是從新下的話回合那麻煩,所以若是能將c#可以調用jar那就太棒了java

ikvmc介紹

IKVMC能夠將jar轉成dll,到如今爲止已經成功轉換3個jar爲dll,期間碰壁無數,在此寫下此篇文章但願能幫助到有須要的人。c#

ikvmc下載安裝

下載並解壓

這並無什麼很大問題,下載壓縮包解壓出來,解壓出來的主要文件在bin目錄下
解壓工具

設置環境變量

在win8.1/win10下的步驟以下:spa

  1. 經過 計算機/此電腦(根據系統名稱而不一樣)右擊->屬性->高級系統設置->環境變量
  2. 找到系統變量下面的path添加路徑如_C:\ikvmc-XXX\bin\;_
  3. 運行命令行cmd,輸入ikvmc查看幫助

cmd-ikvmc

輸出如圖所示,則準備工做已經完成.net

jar->dll

經常使用參數說明

  • -target:library
    使用方法:ikvmc -target:library a.jar命令行

    因爲咱們的目的是把jar轉爲dll,此參數就是此做用3d

  • -reference:<filespec>(-r:<filespec>)
    使用方法: ikvmc -target:library a.jar -r:b.dllcode

    該方法做用若a.jar存在第三方的引用,則咱們須要指明須要引用的dllhtm

具體操做

注意:大多實際狀況其實會很複雜,其實轉換一個jar包,並非一句代碼就能夠轉換的,大多數的jar包會調用不少其餘的包,這就須要作不少工做
我在這裏舉個實際例子

  • 首先了解下項目的大體結構
    這裏有不少依賴項,可是真正須要的包爲圈出來的三個
    項目結構
    因此咱們先嚐試將這三個包轉化爲dll,最後在轉化這個包並指明須要引入的dll

  • 嘗試轉換爲dll

cd 進入到我文件目錄,使用ikvmc -target:library xxx.jar命令轉換爲dll
若是你並無ikvmc使用的經驗那麼,接下來的狀況可能會讓人無語

15
此圖的意思是有些類沒找到,有些類引用錯誤等

16
這幅圖看到不用怕,並非什麼錯誤,而是一些警告,他說:兄弟 你編譯的這些東西我都已經集成了在XXX中了,因此仍是會轉化成功

17
這幅圖和第一個轉化的結果同樣許多class沒引用,不少引用錯誤

以上的錯誤解決方法就是:指明須要引用的'包'(實際是dll)
看不懂什麼意思?也就是說:嘿,我不知道你引用的是什麼,你須要先把他轉化成dll,而後再引用這些dll,我才能認識他們

解決方案

  1. 第二個包已經轉化成功,直接用ikvmc -target:library xxx.jar -r:xxx.dll添加引用便可
  2. 2個找不到類和引用錯誤的包咱們須要將他所引用的jar包先轉爲dll
    可是這裏又是一個問題:
    A->B A-> F B->C B->D D->E .....
    可能會出現這種狀況A依賴B包F包 B包依賴C包D包 D包又依賴於E包。。。
    若是碰到這種狀況:我給你2個建議,
    • 第一個是一直找下去 找到最低層的包爲止,將其轉化,再一層層轉化上來
    • 若某些方法調用了其餘包的方法,而這些方法我咱們又不須要用,那留着幹什麼,何不把他幹掉更輕鬆愉快
  3. 若問題如上所示,找到你所須要掉用的核心代碼,該代碼所須要jar包,我找到的就是那三個jar,其餘的都可有可無下載反編譯工具,經過反編譯jar包爲java,再提取核心代碼變成回jar包,這裏只能靠你本身的聰明才智了

    這是我新建的一個工具項目,InfoXX.jar能夠直接引用,其餘2個包又依賴了別的包,我刪除了可有可無的代碼移除了依賴項,最後經過Export導出便可

再處理以上問題你所花的時間我相信會佔用整個處理過程大部分時間,不要以爲煩,一般狀況,你並非把整個項目轉化爲.net項目,而是某些功能須要調用java的代碼,因此狀況不會太悲觀
這是我導出的jar包,注意下導出的時候無需勾選libs下的依賴jar包,咱們經過將依賴jar包轉化爲dll,顯示的指定,因此無需一塊兒導出

最後經過ikvmc -target:library xx.jar -r:xx.dll進行轉化,轉化成功的如圖所示,未彈出任何錯誤以及警告,若彈出了錯誤和警告dll依然會生成可是你在.net調用可能會報錯

最後須要提很是重要的一點,有些人什麼都喜歡用新的東西(好比我),可是ikvmc彷佛不支持過高版本編譯出的jar包(如1.8),若是一切都已經作很到位,可是仍是導出dll失敗,能夠嘗試下降java編譯器的版本

但願此篇文章能給和我同樣走過坑的人一點幫助

 

裏面會有個 ikvm 的文件夾

其中 bin 下的 ikvm 就是須要用的程序, 能夠先配置環境變量, 方便使用

 

首先編譯 java  爲 .class 文件

而後打包成 .jar

在 cmd 中輸入 ikvmc -target:library -out:A.dll A.jar

其中 A.dll 就是生成後的

參數:

-reference   須要用到的其餘依賴的 dll   例子是    -reference:path/*.dll

-target  目標想轉換成的格式   有 library(dll) 和 exe 等

-out  輸入爲何文件

相關文章
相關標籤/搜索