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:根据大括号中的错误提示,发现是输入的参数不够,所以检查在调用函数时候的参数是否正确,参数的个数是否满足,参数的类型是否正确




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值