linux下java调用matlab方案

 

关于Linux下Matlab与Java的混合编程这方面的资料其实已经有好多,不过总是不是很全,我在实现的过程中,总是遇到这样,那样的问题。经过一段时间的摸索,积聚高手的经验,终于算是告一段落,为了方便自己日后使用和方便需要的朋友,把在使用过程中遇到的问题以及解决方法,在这里做个小结。

第一、matlab的安装

这里涉及到Linux是在有界面还是无界面两种情况,不过大同小异。在有界面情况下,通过mount 命令装载成功后,就完全等同于在xp下的操作了。
 

这里需要注意的是,如果设置下光驱装载的方式(如果是光盘的话,就选择光盘所在的盘符,如果是从镜像文件安装的话选择镜像文件所在的位置)

第二、jdk的安装

一般装linux系统的时候自带有jdk,如果你需要新的版本的jdk,可通过安装盘先将系统自带的jdk卸载,然后在安装需要的jdk版本。

第三、配置环境变量


其中LD_LIBRARY_PATH,XAPPLRESDIR,为matlab需要的环境变量,

JAVA_HOME,PATH,CLASSPATH为java的环境变量,其中部分是myaddprj.jar(matlab生成的包,需要供java调用),javabuilder.jar是matlab中安装mar编译器生成的一个包,mnt为matlab的安装路径

将以上变量设置好之后,执行命令 source /etc/profile

第三编写java主函数,调用我们刚才myaddprj.jar

扫描二维码关注公众号,回复: 2505946 查看本文章

我写的主函数如下

import myaddprj.*;

import com.mathworks.toolbox.javabuilder.*;

public class test {

 public static void myaddtest(){
  //Object result = null;
  myaddclass myadd = null;
  try{
   myadd = new myaddclass();
   //result = myadd.myadd(2,5);
   System.out.println(myadd.myadd(1,new Object[]{1,2})[0]);
  // System.out.println(result[1]);
System.out.println("asdf");
  }catch(Exception e){
   e.printStackTrace();
  }finally{  
   //MWArray.disposeArray(result);
   //if(myadd != null){
   // myadd.dispose();
   //}
System.out.println("it's ok");
  }
 }
 
 public static void main(String[] args){
  myaddtest();
 }
}

myaddprj.jar的生成过程
myaddprj.jar 包括两个m文件,一个是myadd.m ,另外一个是plot_z.其中myadd.m 调用plot_z函数,在编写java主函数的时候只需要调用myadd.m这个接口函数就可以。在编写myaddjar.jar 的时候将myadd.m 和plot_z.m 这两个文件都包含于myaddclass下。

(1)编写需要的m文件(你第一测试可以只写myadd.m这个函数就可以,我是为了测试多函数情况下,java如何调用,经测试,只要调用主函数成功,其他函数直接被主函数调用就可以了,java测测试程序不需要做任何更改)
 

###myadd.m

function y=myadd(x,z)

y=x+z;

m=1:10;

n=plot_z(m);

y=y+n;

end

%%%%plot_z.m

 function n=plot_z ( m )

n=m(1);

end

(2) 在matlab命令窗口下输入 deploytool,就会弹出一个编译窗口,如下图所示


然后点击,file,选择new-deployment project,弹出如下界面


在上图所示的界面中选择matlab builder ja。name的地方填写工程名,这里我们定义为myaddprj.prj.location填写该工程的存储位置。,点击ok, 接下来按照提示一步步来就ok了。


 

第四、出现的各种问题以及解决方案

(1) 在linux下安装matlab有时候会出现缺少libXp.so.6这个文件

解决方法:在安装文件 update/bin/glnx86目录下的libmwins.so文件复制到/usr/lib/下,命名为libXp.so.6

(操作方法:执行命令,cp /cd1/update/bin/glnx86/libmwins.so /usr/lib/libXp.so.6,cd1为matlab在linux下的目录)
 

(2)在调用myadd.jar的时候提示, 缺少libmwmclmcrrt.so.7.13

将matlabroot、/runtime/glnx86 下的该文件拷贝到matlabroot/bin/glnx86下,因为环境变量中指定的是第二个目录下的位置,你也可以将前面那个目录下的文件添到环境变量中

(3)在调用myadd.jar的时候,出现如下图关于libXp.so.6所示的错误

  (4)  调用时报错信息为MCR的问题

   针对本人遇到的,此问题此步骤解决办法是参考了matlab的安装文档,安装了/$matlabroot/toolbox/complier/deply/glnxa64(32位版本为glnx86)目录下的MCRInstaller.bin

  重启机器后,解决问题

(5) 安装MCRInstaller.bin后还报错的解决方法

Exception in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the library libmwmclmcrrt.so.7.13, required by MATLAB Builder JA, 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: 7.13.


at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ProxyLibraryDir.get(MCRConfiguration.java:152)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ProxyLibraryDir.<clinit>(MCRConfiguration.java:158)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getProxyLibraryDir(MCRConfiguration.java:163)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.get(MCRConfiguration.java:77)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.<clinit>(MCRConfiguration.java:87)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getMCRRoot(MCRConfiguration.java:92)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ModuleDir.<clinit>(MCRConfiguration.java:66)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getModuleDir(MCRConfiguration.java:71)
at com.mathworks.toolbox.javabuilder.internal.MWMCR.<clinit>(MWMCR.java:1573)
at VAR.VARMCRFactory.<clinit>(VARMCRFactory.java:134)
at VAR.VAR.<init>(VAR.java:93)
at CallMatLab64.main(CallMatLab64.java:37)

在Project上点击右键,选测Run as,然后选run configurations,之后在Enviroment中添加LD_LIBRARY_PATH变量,值为$matlabroot/bin/glnxa64



解决方法:先查看下usr/lib 下面是否少文件,如果比下图所示的文件个数少,那就说明在装系统的时候少相关库文件


解决方法:(该方法是用系统盘添加缺少的包)

mounts /dev/cdrom /media   (挂载盘)
cd /media && ls    (查看是否挂载成功)
vim /etc.yum.repo/rhxxxx.repo 打开该文件(xxx具体名字忘了)

*****该文件中前两行不需要改,从baseurl开始修改成下文所示的值
[xxxx]
name=xxxx
baseurl=file:///media/Server
enable=1  (这里一定是1,启动服务)
gpgchek=0  (这里一定是0,否则下面不能安装)

保存该文件,执行下面操作就ok
yum -y install *linbXp*  (安装需要的包)
rpm -qa libXp  (查看是否安装成功)

一上就是大概内容,有好多地方也只是为了完成任务而作,或许要更好的方法,如有错误,请大家帮忙指出。


本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2010-10/29492p3.htm


 

猜你喜欢

转载自blog.csdn.net/gaotianyou/article/details/6778683