DK写在前面:
写这篇文章的主要目的是记录一次java调用matlab 打包的jar过程,也参考了很多网上的文章,因为步骤雷同,所以其中一些截图就引用网上的了,以备将来查阅。
文章分为2大部分,一是matlab环境和打包步骤的介绍,二是在安装有matlab和没有安装matlab的机器上,调用和运行matlab打包的 jar 方法。
第一部分:
matlab环境安装和打包jar文件:
本次试验所用的软件及版本为:matlab 2017b, jkd 1.8;
1、matlab 2017b和jdk 1.8的安装配置步骤,不在赘述。
2、脚本编写和打包jar
2.1 打开matlab主程序,显示matlab主页面,在左侧是matlab当前文件夹目录,中间为命令窗口,右边是工作空间,如图:
可以点击左侧当前文件夹窗口上方的图标,更改matlab当前文件夹;
2.2 新建 .m 扩展名的脚本文件
新建脚本有两种方式,一是直接点击ribbon界面菜单栏的新建按钮,在下拉列表中,选择脚本;二是在左侧当前文件夹目录树中,右键,选择新建脚本命令,两种方式是一样的。
2.3 编写函数
双击打开新建的脚本文件,再输入脚本,在此试验借用了网上的一小段代码,“短小精悍”,就拿来主义了。
%画图 自定义函数drawplot 参数 x y function drawplot(x, y) plot(x, y); %%使用matlab函数plot()作图 grid on %网格显示 xlabel('X轴值') ylabel('Y轴值') title('Java调用MatLab作图例子')
直接将以上代码复制粘贴到脚本文件中;
2.4 打包jar
在命令窗口中输入deploytool(可在输入几个字母后,按tab键,有代码提示),弹出Matlab Compiler窗口:
选择 Library Compiler ,弹出如下窗口:
按图中标注的数字顺序依次选择和输入jar包名称、类名和选择脚本文件,最后单击 package按钮,在弹出的保存工程窗口选择保存位置和填写工程名称,打包成功截图如下:
2.5 打包成功之后,会生成下图所示的几个文件夹,具体每个文件夹的作用,没有深究,我们只需从下图 for_testing 文件夹,找到我们需要的在上2.3步骤中命名的 jar 包即可。
到此,matlab将脚本文件打包成可被 java 调用的 jar 的步骤已经完成。
第二部分:
该部分分为2种情况下调用方式:一是在安装有相应版本的 matlab 软件的机器上调用 ,二是在安装matlab compiler runtime (简称 mcr,下文所提到的 mcr,都指该软件) 的机器上调用。
准备所需的 jar:除了在上一部分提到的 matlab 打包生成的 jar 之外 ,还需要在 matlab 安装目录下的 javabuilder.jar,其所在位置如下图(本机安装目录是 c:/Program Files/MATLAB):
(注意:无论是否在安装 matlab 的机器上调用 matlab 所打包的 jar,都要保证 jdk 版本与位数与 matlab 所要求的一致)
一:在安装了相应版本的 matlab 软件的机器上调用打包的 jar :
1、在安装了相应版本的 matlab 机器上调用打包的 jar 时,一般情况下,不需要再配置 matlab 环境,因为我们在安装时,软件自动在环境变量 Path 下配置了相关配置,我们只需要检查一下,是否存在相关配置即可,如果没有 matlab 配置,手动添加即可:
配置为:
C:Program FilesMATLABR2017b untimewin64;
C:Program FilesMATLABR2017bin;
这两个配置还有顺序要求,runtime要在前(根据看到的其他文章中说明,猜测的,没有实际测试)。
2、 java 工程调用
在 myeclipse 中新建 java 工程,将在本部分提到的2个jar包添加到工程引用,并将以下代码写在测试类的 main 方法中,下面的代码中的类名与文章第一部分打包截图有所不一致,读者在按以下代码运行时,应根据代码后面的注释,修改为实际 jar 包中的类名和方法名。
public static void main(String[] args) { MWNumericArray x = null; // 存放x值的数组 MWNumericArray y = null; // 存放y值的数组 plotter plot = null; // 自定义plotter实例,即打包时所指定的类名,根据实际情况更改 int n = 20;//做图点数 try { int[] dims = {1, n}; x = MWNumericArray.newInstance(dims, MWClassID.DOUBLE, MWComplexity.REAL); y = MWNumericArray.newInstance(dims, MWClassID.DOUBLE, MWComplexity.REAL); //定义 y = x^2 for(int i = 1; i <= n; i++) { x.set(i, i); y.set(i, Math.pow(i, 2)); } //初始化plotter plot = new plotter(); //做图 plot.drawplot(x, y);// 在脚本文件中的函数名,根据实际情更改 plot.waitForFigures();// 不调用该句,无法弹出绘制图形窗口 } catch (Exception e) { // TODO: handle exception } finally { MWArray.disposeArray(x); MWArray.disposeArray(y); if(plot != null) { plot.dispose(); } } }
代码运行成功,即弹出如下窗口:
二:在未安装 matlab软件,但安装了 mcr 的机器上调用打包的 jar:
在没有安装相应版本的 matlab 机器上调用 matlab jar时,应当安装 mcr 环境。
1、安装 mcr
获取 mcr 安装包有两种途径,
(1)从 matlab 官网下载对应版本的 mcr。
本次测试所用的 matlab 软件为 2017b版,故在官网(https://cn.mathworks.com/products/compiler/matlab-runtime.html)下载了如下版本的安装包:
在下载完成后得到以MCR_R2017b_win64_installer.exe命名的安装文件,在安装之前,要先解压所下载的文件,虽然是以 exe 结尾的文件,但仍然可解压,如果不解压,在安装过程中可能会出现问题(亲测)。
安装完成后会,会将 C:Program FilesMATLABMATLAB Runtimev93 untimewin64 添加到 Path 环境变量中,如果没有,需要添加该配置。
(2)从已安装 matlab 的目录下拷贝;其所在的目录为:(该种安装方式未测试)
%matlab安装目录%R2017b oolboxcompilerdeploywin64
找到该文件后,在安装之前,应当先解压该该文件(虽然是以.exe结尾的文件,但仍然可解压,如果不解压,安装过程中有可能出现问题)
安装完成后会,会将 C:Program FilesMATLABMATLAB Runtimev93 untimewin64 添加到 Path 环境变量中,如果没有,需要添加该配置。
2、java 调用
该部分与第一部分中的java调用相同,同样出现上文出现的绘图结果窗口。
至此,完成。