1. 程式人生 > >matlab程式打包成jar包,IDEA實現java呼叫matlab程式

matlab程式打包成jar包,IDEA實現java呼叫matlab程式

本文將分為三部分展開,有matlab程式打包成jar包,新增jar包到IDEA並呼叫,遇到的錯誤解決辦法說明。

一. matlab程式打包成jar包
1.環境說明
系統:window7 64位 jdk1.7
matlab版本:matlab2016a 64位 jdk1.7
注意:必須要保證matlab的位數和jdk版本與系統一致(大版本一致即可,如都是1.7或1.6,後面的數字可以不一樣)
2.環境檢視
首先判斷matlab jdk版本,在命令列輸入 version -java 結果為 64位,jdk1.7
在這裡插入圖片描述
檢視系統jdk版本,程式-> cmd -> java -version 結果為64位, jdk1.7
在這裡插入圖片描述


3.matlab編寫m檔案
新建一個m檔案,構造成函式並儲存。如下
在這裡插入圖片描述
在命令列輸入 deploytool ,彈出視窗 選擇 Library Compiler 用來打包成jar包
在這裡插入圖片描述
左上角選擇 Java Package,新增m檔案,修改Class Name中的 檔名為SumFunction,最後點選Package完成打包。
在這裡插入圖片描述
打包完成後,可在D:\Program Files\MATLAB\R2016a\bin\sumTest\for_redistribution_files_only 看到有一個sumTest.jar,這就是我們要的結果。
在這裡插入圖片描述
二. 新增jar包到IDEA並呼叫
1.新增jar包
除了新增matlab生成後的sumTest.jar包外,還要新增matlab自帶的javabuilder.jar包(路徑:D:\Program Files\MATLAB\R2016a\toolbox\javabuilder\jar),因為是matlab打包的jar包,需要依賴matlab中的相關函式。
IDEA中,點選 File->Project Structure->Project Settings -> Libraries 新增上面兩個包。
在這裡插入圖片描述

注意:此次的專案工程的jdk版本也要和matlab版本一致,否則程式執行會報錯。
2.呼叫matlab函式
在java專案中引用生成的matlab.jar和javabuilder.jar。測試程式碼如下:

package com.xy;
import com.mathworks.toolbox.javabuilder.MWException;
import sumTest.SumFunction;

/**
 * Created by Administrator on 2018/10/15.
 */
 //matlab方法為[c] = sumTest(a,b)
//java中方法為matlab例項的方法matlab.sumTest(int,object...),返回值為object[]
//其中輸入的int為輸出的個數,object...為輸入引數,返回值object[]為輸出的集合

public class MatlabTest {
    public static void main(String args[]){
        try {
            SumFunction sumFunction = new SumFunction(); //例項化方法
            Object[] a = sumFunction.sumTest(1,1,2);
            System.out.print("java呼叫matlab函式執行結果:");
            System.out.print(a[0]);
        } catch (MWException e) {
            e.printStackTrace();
        }
    }
}

執行結果:
在這裡插入圖片描述
3.呼叫過程說明
(a) matlab生成的jar包中的類在建立時會可能出錯,會丟擲MWException異常,故建立類時必須用try catch。
(b) 使用包的方法時,會出現多個方法,每個方法的輸入輸出引數型別不是與對應的m檔案中的function一一對應的,所以不能像matlab中那樣直接使用,一般情況下選擇返回為Object[]對應的類。
© 方法中的引數與matlab定義不對應,如上程式碼,sumTest方法多了一個引數,這個引數用來表示輸出的個數,即函式變數的輸出c,如果sumTest的function為function[c,d],要想輸出d的執行結果,這時的sumTest的第一個引數要為2。預設情況下,都是為1,不寫的話會報“輸入引數的數目不足。”的錯誤。

三. 遇到的錯誤解決辦法說明
在java呼叫matlab的jar包過程中,最容易報錯是:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the required library mclmcrrt9_0_1.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: 9.0.

該錯誤有以下幾種可能:

  1. matlab中沒有安裝MCR,需要安裝MCR,MCR路徑在D:\Program Files\MATLAB\R2016a\toolbox\compiler\deploy\win64,,找到該檔案雙擊進行安裝,如果之前存在這個檔案就先解除安裝再安裝,安裝成功後重啟電腦即可。
    2.如果安裝完,仍然報該錯誤,可以嘗試將dll檔案放到專案的lib目錄下。
    3.還有一種容易被忽略的解決方法, 有可能就是因為專案工程的jdk版本與matlab的jdk版本不一致導致報錯(我就是這種情況)。

參考文章:
1.https://blog.csdn.net/qq_19865749/article/details/68556902
2.https://blog.csdn.net/monkey131499/article/details/48786121
3.https://blog.csdn.net/qq_19865749/article/details/68932949
4.https://blog.csdn.net/jinliwei1990/article/details/55505133