1. 程式人生 > >java呼叫matlab:二、在服務端(客戶機)搭建執行環境和常見問題解決

java呼叫matlab:二、在服務端(客戶機)搭建執行環境和常見問題解決

在服務端(客戶機)搭建matlab執行環境

1.下載MCR到客戶機

https://cn.mathworks.com/products/compiler/matlab-runtime.html

注意對應的版本和位數,我的是matlab2012b x64就下載這個


二、安裝下載下來的MCR,一路下一步安裝就可以了,無需註冊碼。

檢查 環境變數>>Path中是否已經有了C:\Program Files\MATLAB\MATLAB Compiler Runtime\v80\runtime\win64;

這項,有就是安裝成功了。

三、配置java環境變數

注意:客戶機配置的jdk版本一定要和編譯matlab的java jar包時的版本一致,否則跑步起來。

1.在matlab中執行 version -java獲取版本號:


>> version -java
ans =
Java 1.6.0_17-b04 with Sun Microsystems Inc. Java HotSpot(TM) 64-Bit Server VM mixed mode

2.網上下載 jdk1.6  x64版本,安裝。

配置java環境變數,這一步搞java的是常識,自行配置。

在cmd中檢驗 java -version 和 javac -version 一致。

四、檢驗MCR環境

1.建議用matlab生成一個windows application test_demo.exe,有彈出視窗的那種。拷貝到客戶機,用於測試環境是否搭建好。

拷貝到桌面,雙擊test_demo.exe看反應。

運氣好的 新機器雙擊就能跑了,運氣差的就各種問題。。。

跑起來的[檢驗MCR環境]OK,跑步起來往下看。

2.先將這個exe 複製到 D:\Program Files\MATLAB\MATLAB Compiler Runtime\v80\runtime\win64; 中,雙擊看反應;

一般都能跑起來,跑不起來就是MCR版本/位數跟生成環境對應不上。重灌MCR後,重複這一步。

3.將這個exe複製到D盤根目錄,開啟CMD,執行D: 切換到D盤,執行 MemShieldStarter xxx.exe

看反應,cmd中會列印執行過程和報錯提示。

CMD中執行MemShieldStarter xxx.exe通過,正常彈出matlab的視窗,就說明MCR環境沒有問題了。

java呼叫報錯問題繼續往下看。

常見報錯解決:

1.libut.dll or libmx.dll are not found 

 Fatal error loading library C:\Windows\system32\libmx.dll Error: 找不到指定的模組

找不到檔案libmx.dll,百度好久沒答案,拿個梯子一google就找到答案了。。。

Why do I receive errors saying native MCR dlls such as libut.dll or libmx.dll are not found when I run an application created by the MATLAB Compiler 4.16 (R2011b)?

 Accepted Answer

This error may occur because a copy of the DLL in question resides somewhere on the system that is getting loaded before the expected version of of the DLL located in the MCR runtime directories.

The current application folder (where the executable is located) and OS system folders will be searched before the MCR runtime folder if they reside earlier on the system path. These usually contain the offending extra copy of the DLL.  Start by checking the path returned in the error message for the extra copy (it is likely but not necessary that the extra copy is located on this path).

To resolve this issue, make sure to remove any extra copies of the offending DLL files located on the machine.

The only correct versions of the MCR runtime DLLs should be in a subdirectory of the MCR installation, usually in the bin or runtime folders.

翻譯過來就是:

這個錯誤可能會發生,因為這個DLL的副本存在於系統的某個地方,這個系統在MCR執行目錄中,在預期的版本中載入了。
當前的應用程式資料夾(可執行檔案的位置)和OS系統資料夾將在MCR執行時資料夾之前被搜尋,如果它們位於系統路徑的前面。這些通常包含DLL的額外副本。首先檢查在錯誤訊息中返回的路徑,以獲得額外的副本(很有可能,但是多餘的副本位於此路徑上是不必要的)。
要解決這個問題,請確保刪除位於機器上的任何多餘的DLL檔案副本。
MCR執行時dll的唯一正確版本應該位於MCR安裝的子目錄中,通常在bin或執行時資料夾中。

不要在windows/system32中放 mclmcrrt8_0.dll 或 mclmcrrt9_0.dll等等,C#的com元件自動關聯,先找到了windows/system32中的mclmcrrt8_0.dll,在找其他的dll找不到就報錯。

刪除windows/system32中的mclmcrrtX_X.dll即可。

2.Failed to find the library mclmcrrt8_0.dll 

找不到MCR執行環境。

檢查系統環境變數path中是否引入,每次系統變數修改都要重新開啟後執行命令cmd才生效,嘗試 

[四、2.先將這個exe 複製到 D:\Program Files\MATLAB\MATLAB Compiler Runtime\v80\runtime\win64; 中,雙擊看反應;

一般都能跑起來,跑不起來就是MCR版本/位數跟生成環境對應不上。重灌MCR後,重複這一步。]

3.mclmcrrt initlization failed

初始化失敗

雙擊彈出視窗初始化失敗的原因很多,建議在cmd中執行MemShieldStarter xxx.exe檢視具體報錯。

一般都是MCR環境問題,參考 問題2. 的答案。

4.java呼叫matlab生成的jar報錯,報錯只有一種

Exception in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the required library mclmcrrt8_5.dll on java.library.path. This library is typically installed along with MATLAB or the MCR. Its absence may indicate an issue with that installation or the current path configuration. The MCR version that this component is trying to use is: 8.5.

環境不對找不到dll等等。

先確定 在桌面雙擊test_demo.exe可以正常跑起來。

跑不起來就是MCR環境還有問題,回去繼續解決。

跑起來就是MCR環境OK了,java環境有問題。

java環境配置:java專案中設定jre版本,jre版本 要 與 matlab中 執行 version -java返回版本和位數一致。


設定完可能會有快取,把MJBuilderTest.java隨便改一下儲存重新編譯在跑一次。

跑起來還是報錯的話換個專案少的eclipse匯入這個測試專案,在設定一遍jre跑,有可能是快取影響。

總結:

matlab是做線性規劃資料建模的專業工具,java能夠直接呼叫的話還是省了很多在java實現演算法的麻煩。

但是目前看MCR跟JRE的穩定性相比差了不少,如果不是在服務端呼叫matlab,在客戶機器呼叫,而且客戶機器很多的話,甚用,否則問題多多。