1. 程式人生 > >用IKVMC將jar轉成dll供c#調用

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

又是 code 解決 轉化 自己的 不知道 使用方法 div 右擊

參考資料:https://www.cnblogs.com/Jack-Blog/p/4710848.html

  • 用IKVMC將jar轉成dll供c#調用
    • 前言
    • ikvmc介紹
    • ikvmc下載安裝
      • 下載並解壓
      • 設置環境變量
    • jar->dll
      • 常用參數說明
      • 具體操作
      • 解決方案

前言

實習到現在所需要的工具類給的都是jar包,但是我需要在.net環境下去實現,如果重新下的話回合那麻煩,因此如果能將c#能夠調用jar那就太棒了

ikvmc介紹

IKVMC可以將jar轉成dll,到現在為止已經成功轉換3個jar為dll,期間碰壁無數,在此寫下此篇文章希望能幫助到有需要的人。

ikvmc下載安裝

下載並解壓

這並沒有什麽很大問題下載壓縮包解壓出來,解壓出來的主要文件在bin目錄下

技術分享圖片

設置環境變量

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

技術分享圖片

輸出如圖所示,則準備工作已經完成

jar->dll

常用參數說明

  • -target:library
    使用方法:ikvmc -target:library a.jar
    由於我們的目的是把jar轉為dll,此參數就是此作用
  • -reference:<filespec>(-r:<filespec>)
    使用方法: ikvmc -target:library a.jar -r:b.dll
    該方法作用若a.jar存在第三方的引用,則我們需要指明需要引用的dll

具體操作

註意:大多實際情況其實會很復雜,其實轉換一個jar包,並不是一句代碼就可以轉換的,大多數的jar包會調用很多其他的包,這就需要做很多工作

  • 首先了解下項目的大致結構
    這裏有很多依賴項,但是真正需要的包為圈出來的三個
    技術分享圖片

所以我們先嘗試將這三個包轉化為dll,最後在轉化這個包並指明需要引入的dll

技術分享圖片

  • 嘗試轉換為dll

cd 進入到我文件目錄,使用ikvmc -target:library xxx.jar命令轉換為dll
如果你並沒有ikvmc使用的經驗那麽,接下來的情況可能會讓人無語

技術分享圖片

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

技術分享圖片

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

技術分享圖片

這幅圖和第一個轉化的結果一樣許多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編譯器的版本

希望此篇文章能給和我一樣走過坑的人一點幫助

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