MATLAB的程序文件为.m文件,可在MATLAB环境下直接运行,但不能够被JAVA直接调用。利用MATLAB的编译器扩展功能,可将.m文件编译成JAVA能够直接调用的.class文件包.JAR。JAVA在调用通过.m转化而来的.class文件时,需要在运行JAVA的主机中安装随同MATLAB软件包一同发布的MCRInstaller环境支撑程序。此外,JAVA与MATLAB混合编程时由于两种语言中的数据类型不能一一对应,因此,在数据交换时会存在数据类型转换的问题。
将.m文件编译为.class文件
鼠标左键单击MATLAB菜单“File/New/Deployment Project”选项,在创建工程的对话框左边选择“MATLAB Builder JA”,输入工程名称并选择工程文件保存位置后单击“OK”按钮,建立工程,如图1所示。
鼠标右键单击“Deployment tool”窗口中与工程名同名的文件夹,选择“add file”将已经建好的.m文件加入工程,然后鼠标左键单击“Deployment tool”窗口的快捷按钮“Build”,对工程进行编译。编译将.m文件编译为.class文件,并将其打包成JAR文件。
编译结束后,在MATLAB工程文件所在位置将生成两个文件夹“distrib”和“src”,其中“distrib”中包含与工程同名的JAR文件,“src”中包含实现功能相同的MATLAB和JAVA源文件,备开发人员参考。
JAVA对MATLAB程序的集成
创建JAVA工程,在调用MATLAB程序功能的类中引用安装MCRInstaller后所产生的“javabuilder.jar”和MATLAB工程文件夹“distrib”中的.jar文件。假设MATLAB工程所产生的JAR文件为“analyse.jar”,则引用语句如下。
import com.mathworks.toolbox.javabuilder.*;
import analyse.*;
同时在JAVA工程的库搜索路径中加入“javabuilder.jar”和“analyse.jar”的路径。
在JAVA中定义以.m文件名为类名的对象,假设类名为“Analyse”,则定义对象和产生对象实例的语句如下。
Analyse theMagic = null;
theMagic = new Analyse();
调用MATLAB程序功能的语句如下。
result= theMagic.makeResult(1,data);
其中,result为接收返回数据的Object型对象,1表示传递给makeResult函数的参数个数为1,data表示传递给makeResult函数的数据参数。
经过上述过程,实现JAVA集成MATLAB程序的功能,其中,JAVA将result中以Object形式存储的数值进行转换,就可以得到MATLAB传递给JAVA的返回值。
JAVA与MATLAB数据交换
Mathworks公司开发了一个供JAVA使用的包“com.mathworks.toolbox.javabuilder.MWArray”, 来解决JAVA与MATLAB混合编程时的数据类型转换。该包中包含一个JAVA抽象类MWArray,该类有MWNumericArray、MWLogicalArray、MWCharArray、MWCellArray和MWStructArray等五个子类,这五个子类均以数组形式存储一组值,这些值可以为数值型、逻辑型、字符型、细胞型或者结构型。
JAVA程序在调用MATLAB程序之前,应该将要传输的数据按照类型先转换为这五个子类中的一种,然后对MATLAB程序进行调用。下面根据不同的情况,对两者之间数据的交换方式进行说明。
JAVA向MATLAB传递参数
这种情况是指程序的功能已经用MATLAB函数的形式实现,调用该MATLAB函数时需要提供参数。此时,JAVA在调用该MATLAB函数之前,应该将要传递的参数按照类型要求存入MWArray的相应子类的对象中,然后以“参数个数,参数”的形式调用MATLAB函数。
例如,MATLAB函数为matfun(n),其中n为浮点型,位于matfile.m文件中。JAVA程序调用该函数代码片段如下。
MWNumericArray n = null;?? /* 存储输入参数 */
Matfile theProg = null;???? /* 存储Matfile类实例 */
n = new MWNumericArray(6.237, MWClassID.DOUBLE);
/* 产生存储输入参数的实例,并将参数6.237存入 */
theProg = new Matfile ();?? /* 产生Matfile类实例 */
theProg.matfun(1, n);
/* 调用函数matfun,1表示参数个数,n为存储参数的实例 */
MATLAB向JAVA返回结果
这种情况是指MATLAB函数执行完毕,需要向JAVA程序返回执行结果数据。此时,在JAVA程序中需要定义Object型对象,接收返回数据,然后将其转换后取出。
例如,MATLAB函数为matfun(),位于matfile.m文件中,执行完毕后返回一列浮点型数据。JAVA程序调用该函数并接收返回值代码片段如下。
Matfile theProg = null;??? ?/* 存储Matfile类实例 */
Object[] result = null;????? /* 接收matfun()返回值对象实例 */
theProg = new Matfile ();?? /* 产生Matfile类实例 */
result = theProg.matfun();? /* 调用函数matfun,结果存储在result中*/
double[][] retVal = new double[result.length][]; /* 存储函数返回结果的二维数组 */
for (int k = 0; k < result.length; k++)? /* 循环次数为返回的数据个数 */
retVal[k] = (double[])((MWArray)result[k]).getData();??
/* 先将result[k]转换为MWArray类型后通过getData()取出其值,然后将取出的值转换为double[]类型后存入retVal数组 */
JAVA调用MATLAB的绘图函数
这种情况是指JAVA程序调用MATLAB的具有绘图功能的函数,在JAVA运行环境中显示MATLAB程序所绘制的图形。
例如,MATLAB函数为matfig(),位于matfile.m文件中,功能是绘制一幅图形。JAVA程序调用该函数并显示所绘图形的代码片段如下。
Matfile theProg = null;???? /* 存储Matfile类实例 */
theProg = new Matfile ();?? /* 产生Matfile类实例 */
theProg.matfig();?????? /* 调用函数matfig()绘图 */
theProg.waitForFigures();? /* 在JAVA运行环境中显示图形 */