1. 程式人生 > >windows下使用eclipse java程式呼叫.so檔案

windows下使用eclipse java程式呼叫.so檔案

問題描述: Java專案,做中介軟體的,之前是在Linux系統下開發,用JNI呼叫核心部提供的.so檔案,但是現在又要Windows系統下測試執行情況,所以提出了題目中的問題:怎麼在Windows下使用eclipse java程式呼叫.so檔案?上網查全是在Linux下調.so和在Windows下調.dll檔案,跟我的情況不匹配。以下是我的思考與總結。

思路: 這個問題的本質其實在於JNI的缺點—-破壞了Java的跨平臺性。雖然Java專案是跨平臺的,可以輕易的從Linux移植到Windows,但是C/C++是不跨平臺的。.dll檔案和.so檔案在呼叫時是需要編譯連結的,這就要求系統必須要有相對應的環境,因此是不能在Windows下調.so檔案的,也不能在Linux下調.dll檔案。因此從理論上來講,這個問題只有後面講的兩個笨方法,而沒有太完美的解決辦法(我查到有說用工具可以在Windows下生成.so檔案的,但也沒有講清楚能不能執行,如果有更好的辦法請大神留言多多指教)。所以解決思路就是要麼換開發環境,要麼生成對應於.so檔案的.dll檔案。

解決辦法:

  • 將.so檔案對應的C/C++原始碼拿到Windows下編譯連結,生成.dll檔案,替換原來的.so檔案即可。(如果拿不到原始碼就沒辦法了)
  • 將開發環境換成Linux下的,這樣一定可以成功呼叫.so檔案。

    總結: JNI使得Java可以執行本地方法或介面,但也破壞了Java的跨平臺性。所以除了以下三種情況外,最好不要用JNI:

  • 專案中的某個部分的演算法對效率有著很嚴的要求,需要使用偏底層的C/C++來提高效率

  • 現有的API不支援專案中的一些環境,需要自己在底層實現
  • 專案很在意資源利用,不願意跨程序,不願意增加時間、記憶體開銷

    而非必須條件下可以用跨程序(如用TCP/IP來呼叫本地的函式)或者跨機器(如部署成分散式)來代替JNI.