您的位置:首页 > 编程语言 > MATLAB

花了一天,解决java调用matlab

2015-10-17 18:52 246 查看
鉴于labview做不了web(labview强项在于硬件仪器控制,可能也可以做web,还不会),虽然有web发布工具,但是基于远程前面板,最后效果都呈现在前面板上(涉及了跳转页面、matlab绘图等只在服务器端上显示的问题)。因此,打算用java web尝试实现。

首先找了个java调用matlab生成的jar的步骤。在matlab中写了一个验证采样定理的m文件testjava(没有输入参数),在matlab中运行成功后,控制窗口输入deploytool,打开窗口,输入工程并选择生成java package,右边出现了新的项目栏,点击add class,修改class名。注意该名在java调用时就是类的名字。然后add files,选择m文件testjava。然后点击build就可以生成jar,这个生成的过程似乎有点久…更详细可以参考链接:http://zhidao.baidu.com/link?url=XlnSDJIKDlCuec6UsBShMDt6yADdBVtbVID1G8PuBGdjD5Y3pExRB8MmepnAobKbs7R2JYky45rsV-HuJmZksVhteUf9ozkbnR_CoCA0o_u

接着就可以尝试再eclipse中调用jar。将刚才生成的jar和matlab自带的javabuilder.jar作为externaljars添加到lib中(先以Java SE为例)。然后新建class实现生成的类。一定要将添加的jar给import进来。写法就是调用类,然后执行类的函数。可以参考这个也是调用matlab画图的例子:/article/1413987.html

在Java SE中编译,提示错误,编译所需要的mclmcrrt7_17.dll找不到。百度了这个问题,然后去dll网站下了一个然后复制到system32文件夹中,无用。然后看到另外一种解决办法,说是因为要装个MCR,在matlab路径中有,我的在E:\MATLAB_R2012a\toolbox\compiler\deploy\win32\MCRInstaller.exe中。安装完后就可以运行了,控制台显示正在createplot。

然而我高兴的太早了。画出来的图竟然是空的(就是能显示matlab的画图的外框,但是图是空的,灰色的。这tm什么鬼?继续百度。找到一篇百度经验:http://jingyan.baidu.com/article/9faa7231587bd0473c28cbf9.html,说是jdk和matlab不兼容造成的,我的matlab是2010b的,打-versionjava出来是需要jdk1_6_17。而此时我的环境是jdk1.7的(在dos中java
–version)。

那就换个1.6的jdk呗,可以参考这篇文章,http://blog.sina.com.cn/s/blog_88f38b360100yd0j.html。实际上很简单,就是下载个新的jdk,安装,然后修改系统环境变量即可。在用%设置的环境变量中,只需要修改JAVA_HOME即可。我修改成了jdk1.6的路径。

接下来发生的一切简直要让我疯掉:修改了环境变量后,在dos中打java –version,发现还是1.7的环境!我不服,重启了,结果还是1.7环境!我简直不敢相信了,我再检查了一遍环境变量的设置,明明都设置成1.6的路径了。我想会不会刚好1.6的包有问题,于是我又下载安装了1.6_39的升级包,重复以上工作。结果显示还是1.7的环境!

是不是无所谓呀?于是我不管了,在eclipse中新建个1.6的工程,然后用1.6的jdk,结果…现在已经不是画出空的图了,现在连图都画不出来,而是报错:Unsupportedmajor.minor version 51.0。这连图都画不出来了呀,简直要崩溃了,怎么那么费劲呢。再次百度以下这个错误,发现这篇文章,http://swiftlet.net/archives/716。原因是外部jar包使用jdk1.7(jdk7)编译,而使用此jar包的工程jdk版本为jdk1.6(jdk6)。这下我大概能知道原因了:之前因为是1.7的工程,所以能编译,至于画不出来图,那是因为matlab必须联合1.6的jdk才能画出来图。所以jdk必须使用1.6没错,编译不成功的原因在于,我的jar还是1.7的,因为dos中java
–version是1.7的,所以生成的jar是1.7的。所以解决办法应该是:使得java –version是1.6,然后重新生成jar,此时就是1.6的包了,然后导入1.6的工程,就可以了。这个连接http://zhidao.baidu.com/link?url=HOIRV3gzG6DnHgD3hBv2deQTb6vlxOvJUn5Sb8Sg205InYrFgwQbod4KGTv4hI2l4yJl9LVmnBGpkfStdm_baK。最下面那位网友的回答我证实了我的想法。我干脆一不做二不休,把jdk1.7卸载了。现在按照环境变量设置的,dos中显示了1.6_39的版本。后来查资料才找到。1.7版本在安装的时候会修改注册表而不管环境变量了,改1.6版本就算修改了环境变量也没有真正的修改jdk环境,唯一的办法只能是在控制面板中将1.7卸载掉。

结果这次终于能顺利的画出来图了,太激动了!接下来我把Java Se移植到Java EE中,在jsp页面或者类中实现,均能画出图来,本地是成功的。接下来我想测试局域网是否能成功。

通过下面文章,http://blog.csdn.net/chendc201/article/details/22905489,顺利配置了tomcat
8086端口在局域网中的防火墙例外,只要网址中的localhost换成我的ip地址,就能够顺利的从其他局域网内的电脑和手机浏览器浏览到我做的所有网页。

然而我还是高兴的太早,一旦我在客户端访问到有matlab画图的页面时,它还是在服务器端弹出了matlab图。好吧,花了半天,效果和在LabVIEW中一样。网上说可以把画出来的图通过html静态显示,配合WebFigure标签可以实现,但是这方面资料特别少,到现在就找到2篇,而且还说的模模糊糊的。后面再说吧,今天太累了,休息一会。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: