许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  从Eclipse Java调用MATLAB API踩坑记录

从Eclipse Java调用MATLAB API踩坑记录

阅读数 6
点赞 0
article_banner
写在前面,作者是Java新手,最近在尝试用Java调用Matlab API来进行计算。下面的内容是一份踩坑的记录,并将我遇到的一些问题写出来。希望对其他朋友也有所帮助,

重点提示

  1. Java版本需要是Java7或者Java8。(我最开始使用的Java14和Java11都会出错)
  2. 需要配置
  3. 我使用的环境是MacOS,Windows方法应该是类似的,路径肯定是不一样的。

两个 Demo 代码

Matlab中自带了两个从Java中调用Matlab的demo代码,还有一个README。位置在:matlabroot/extern/examples/engines/java。这里的matlabroot需要被替换成真正的root,比如在Mac上可能是/Applications/MATLAB_R2018b.app。我们可以在matlab的命令行中输入``matlabroot`,就会返回该值,如下图

在这里插入图片描述

这两段代码是,

  • EngineConsoleDemo.java
  • EngineGUIDemo.java

这个路径下还有一个README 文本文件  ,有一些说明。为了验证调用成功,可以测试这两个程序是否能成功运行

步骤

  1. 默认已经安装较新的Matlab,这个应当只要够新就好,我用的是Matlab2018b
  2. 安装JDK 8。Oracle链接,需要注册账号并登陆。 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
  3. 安装Eclipse,Eclipse官网上有两种下载安装方式,一种是下载一个下载器,另一种是直接下载安装包。如果用第一种在国内可能会下载很慢,所以建议直接下载安装包,下面是下载页面。Eclipse的版本和JDK的版本是分开的 https://www.eclipse.org/downloads/packages/release/kepler/sr2/eclipse-ide-java-ee-developers
  4. 首先通过命令行测试 确认Java版本正确。在命令行输入java -version返回版本,如果只有Java7或者Java8,就可以跳过下一步。 设置Java。命令行中输入/usr/libexec/java_home -V,可以看到返回已经安装的Java版本, 如下 ➜ java /usr/libexec/java_home -V Matching Java Virtual Machines (3): 14.0.1, x86_64: "Java SE 14.0.1" /Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/Home 11.0.8, x86_64: "Java SE 11.0.8" /Library/Java/JavaVirtualMachines/jdk-11.0.8.jdk/Contents/Home 1.8.0_261, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home 一键获取完整项目代码shell12345 在这里我们有Java SE 14``Java SE 11和Java SE 8三个版本 输入 export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_261, x86_64` 这时,我们再输入java -version,便可以发现Java默认版本已经被设置为1.8了 编译。在Demo文件夹(matlabroot/extern/examples/engines/java)中输入下面一行 javac -classpath .:/Applications/MATLAB_R2018b.app/extern/engines/java/jar/engine.jar EngineConsoleDemo.java 一键获取完整项目代码shell1 其中/Applications/MATLAB_R2018b.app/应该是本机的matlabroot。没有报错就好。原因是在代码EngineConsoleDemo.java中有import com.mathworks.engine.MatlabEngine; 运行。同样在这个文件夹 java -Djava.library.path=/Applications/MATLAB_R2018b.app/bin/maci64 -classpath .:/Applications/MATLAB_R2018b.app/extern/engines/java/jar/engine.jar EngineConsoleDemo 一键获取完整项目代码shell1 这里,需要将maci64这个文件夹添加到JRE的路径中,也需要链接engine.jar 大功告成
  5. 在Eclipse中测试 命令行中运行成功了,现在离成功只有一步之遥 首先需要确保Eclipse是装好了的,可以用一个Eclipse的HelloWorld程序进行测试。这里就不再赘述。和命令行中一样,我们需要的只有三点,(1)将engine放进build path,(3)将maci64这个文件夹加入到路径(3)确保使用的JRE版本是7或8 确保JRE版本。在当前project上,右键—Build Path—Configure Build Path…—弹出界面中Libraries–找到JRE System Library—Edit 在Execution environment中找到1.8,如果找不到就通过alternative JRE添加。 将engine放入路径 同样在Configure Build Path…页面中点add external JARs,找到/Applications/MATLAB_R2018b.app/extern/engines/java/jar/engine.jar。保存 将maci64放入路径 同样在Configure Build Path…页面找到JRE System Library,点击左边小三角展开。找到Native Library location,单击选中,点右边的Edit … 选择External folder找到/Applications/MATLAB_R2018b.app/bin/maci64这个文件夹,保存。 运行代码,如果两个Demo程序中的Console程序有输出没有报错,GUI程序弹出窗口,点击start,输入input有反馈,就可以了。这是一个计算阶乘的程序。
  6. 大功告成

遇到的两个错误

  • 可以编译,但是运行的时候报错SIGSEGV,A fatal error has been detected by the Java Runtime Environment
       
  • 找不到main
       
  • 报错no nativemvm in java.library.path(不记得是编译还是运行时)
       
  • 弄错engine路径
       

附上其他在文中没有出现的资料

  • Matlab官方的Build Java Engine Program的说明,很重要。但是这一份材料是说通过命令行执行,和Eclipse中使用还有一些距离。
       
  • 被很多相关问题回答者提到的JMI Wrapper,MatlabJava Server和MatlabControl,虽然我并没有使用到。
       
  • Eclipse中设置路径 java.library.path
       
  • 一个肯定可以用的Helloworld
       
    免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空