java中調用matlab程序及相關問題

**在java中調用matlab程序,首先要將matlab程序打包成jar文件,纔可以被java程序所調用。

打包時本人所用的各種工具:
1:myeclipse-bule
2:java-1.7
3:matlab R2011b(有java packet即java打包環境)

檢查打包環境
1:在DOS窗口(cmd調用)中輸入java -version或javac -version檢查jdk版本

2:在matlab的控制窗口中輸入version -java檢查matlab所需的最低jdk版本

matlab中檢查jdk版本

檢查打包環境的作用:

保證java的運行壞境和matlab程序打包時的環境一樣,避免出現很多雜亂的問題。由於之前我用的是jdk1.8,但是另一臺電腦上用的是jdk1.7,當從1.7的那臺電腦上拷過來的jar包放到我的1.8的電腦上運行時,就會出現各種小問題(因爲問題太多,所以當時也沒有留心copy問題,只想着解決方案了快哭了快哭了),所以建議在打包之前一定先檢查環境的配置。


開始將matlab程序轉換爲jar包

1:編寫matlab程序(.m文件),保存

function [ sum,sub,mul,div ] = calc( a,b )
sum=a+b;
sub=a-b;
mul=a*b;
div=a/b;
end
function

2:在matlab命令窗口中輸入deploytool,調出deployment project工具,新建java packet項目


deployment project

3:在build中修改class(類名)名稱,並加入源文件。之後進行編譯。

build

4:打包完成

finish

5:打包完成之後的目錄結構

FileStructure


在MyEclipse中開始測試jar包

1:在java項目下的lib文件夾中導入calculate.jar包(即我們之前所打包的jar包)和javabuilder.jar(在E:\Matlab\toolbox\javabuilder\jar文件目錄下)包。

structure

2:新建測試類JiSuan,源碼如下

/**
 * JiSuan.java [V 1.0.0]
 *classes:com.JiSuan
 *Create at: 2015年8月12日下午10:20:04
 */
package com;

import java.util.Scanner;

import com.mathworks.toolbox.javabuilder.MWException;

import calculate.CalcTest;
import calculate.CalcTestRemote;

/**
 * com.JiSuan
 * 
 * @author xiangdong  Create at:2015年8月12日.下午10:20:04
 */
public class JiSuan {
	public static void main(String[] args) throws MWException {
		Object result[] = null;
		CalcTest calc = null;
		int m, n;
		calc = new CalcTest();

		System.out.println("從鍵盤輸入兩個操作數:");
		System.out.print("輸入第一個操作數:");
		Scanner scan = new Scanner(System.in);
		m = scan.nextInt();
		System.out.print("輸入第二個操作數: ");
		n = scan.nextInt();

		result = calc.calc(4, m, m);
		System.out.print("The sum of " + Integer.toString(m) + " and "
				+ Integer.toString(n) + " is: ");
		System.out.println(result[0]);
		System.out.print("The sub of " + Integer.toString(m) + " and "
				+ Integer.toString(n) + " is: ");
		System.out.println(result[1]);
		System.out.print("The mul of " + Integer.toString(m) + " and "
				+ Integer.toString(n) + " is: ");
		System.out.println(result[2]);
		System.out.print("The div of " + Integer.toString(m) + " and "
				+ Integer.toString(n) + " is: ");
		System.out.println(result[3]);
	}

}
3:運行測試

result


其中所遇到的問題及解決方法:

一:

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.

	at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ProxyLibraryDir.get(MCRConfiguration.java:259)
	at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ProxyLibraryDir.<clinit>(MCRConfiguration.java:265)
	at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getProxyLibraryDir(MCRConfiguration.java:270)
	at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.get(MCRConfiguration.java:71)
	at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.<clinit>(MCRConfiguration.java:81)
	at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getMCRRoot(MCRConfiguration.java:86)
	at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ModuleDir.<clinit>(MCRConfiguration.java:60)
	at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getModuleDir(MCRConfiguration.java:65)
	at com.mathworks.toolbox.javabuilder.internal.MWMCR.<clinit>(MWMCR.java:1503)
	at Untitled1.Untitled1MCRFactory.newInstance(Untitled1MCRFactory.java:48)
	at Untitled1.Untitled1MCRFactory.newInstance(Untitled1MCRFactory.java:59)
	at Untitled1.Class1.<init>(Class1.java:62)
	at com.PlotTest.main(PlotTest.java:19)
分析:1.因爲之前一直用的是jdk1.8,所以產生這種問題可能可jdk的版本有關。

2.因爲程序中要調用到matlab的圖形界面,所以需要加入 mclmcrrt*.dll(*代表版本的不同,每個不同的matlab都有不同.dll文件),所以檢查自己的.dll文件和自己版本的matlab中的是否一樣

3.加入mclmcrrt*.dll時的路徑是否正確??

4.mclmcrrt*.dll是32位還是64位,應與操作系統和jdk版本都一致,最好保證所有的都和操作系統位數一樣。不然真的會出很多幺蛾子。


二:

{Error using plotcos1 (line 5)
Not enough input arguments.
} 
Exception in thread "main" ... Matlab M-code Stack Trace ...
file C:\Users\XIANGD~1\AppData\Local\Temp\xiangdong she\mcrCache7.16\Untitl0\Matlab\matlab\yuanma\plotcos1.m, name plotcos1, line 5.
com.mathworks.toolbox.javabuilder.MWException: Error using plotcos1 (line 5)
Not enough input arguments.
	at com.mathworks.toolbox.javabuilder.internal.MWMCR.mclFeval(Native Method)
	at com.mathworks.toolbox.javabuilder.internal.MWMCR.access$600(MWMCR.java:23)
	at com.mathworks.toolbox.javabuilder.internal.MWMCR$6.mclFeval(MWMCR.java:833)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.mathworks.toolbox.javabuilder.internal.MWMCR$5.invoke(MWMCR.java:731)
	at com.sun.proxy.$Proxy0.mclFeval(Unknown Source)
	at com.mathworks.toolbox.javabuilder.internal.MWMCR.invoke(MWMCR.java:406)
	at Untitled1.Class1.plotcos1(Class1.java:214)
	at com.PlotTest.main(PlotTest.java:20)

問題分析:

1:根據大括號中的錯誤提示,發現是輸入的參數不夠,所以檢查在調用函數時候的參數是否正確,參數的個數是否滿足,參數的類型是否正確




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章