写在前面,作者是Java新手,最近在尝试用Java调用Matlab API来进行计算。下面的内容是一份踩坑的记录,并将我遇到的一些问题写出来。希望对其他朋友也有所帮助,
重点提示
- Java版本需要是Java7或者Java8。(我最开始使用的Java14和Java11都会出错)
- 需要配置
- 我使用的环境是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 文本文件 ,有一些说明。为了验证调用成功,可以测试这两个程序是否能成功运行
步骤
- 默认已经安装较新的Matlab,这个应当只要够新就好,我用的是Matlab2018b
- 安装JDK 8。Oracle链接,需要注册账号并登陆。 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
- 安装Eclipse,Eclipse官网上有两种下载安装方式,一种是下载一个下载器,另一种是直接下载安装包。如果用第一种在国内可能会下载很慢,所以建议直接下载安装包,下面是下载页面。Eclipse的版本和JDK的版本是分开的 https://www.eclipse.org/downloads/packages/release/kepler/sr2/eclipse-ide-java-ee-developers
- 首先通过命令行测试 确认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 大功告成
- 在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有反馈,就可以了。这是一个计算阶乘的程序。
- 大功告成
遇到的两个错误
- 可以编译,但是运行的时候报错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
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删