从Eclipse Java调用Matlab API采阬记

写在前面,作者是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链接,需要注册账号并登陆。

    1. https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
  3. 安装Eclipse,Eclipse官网上有两种下载安装方式,一种是下载一个下载器,另一种是直接下载安装包。如果用第一种在国内可能会下载很慢,所以建议直接下载安装包,下面是下载页面。Eclipse的版本和JDK的版本是分开的

    1. https://www.eclipse.org/downloads/packages/release/kepler/sr2/eclipse-ide-java-ee-developers
  4. 首先通过命令行测试

    1. 确认Java版本正确。在命令行输入java -version返回版本,如果只有Java7或者Java8,就可以跳过下一步。

    2. 设置Java。命令行中输入/usr/libexec/java_home -V,可以看到返回已经安装的Java版本,

      1. 如下

      2.  ➜  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
        
      3. 在这里我们有Java SE 14``Java SE 11Java SE 8三个版本

      4. 输入 export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_261, x86_64`

      5. 这时,我们再输入java -version,便可以发现Java默认版本已经被设置为1.8

    3. 编译。在Demo文件夹(matlabroot/extern/examples/engines/java)中输入下面一行

      1.  javac -classpath .:/Applications/MATLAB_R2018b.app/extern/engines/java/jar/engine.jar EngineConsoleDemo.java
        
      2. 其中/Applications/MATLAB_R2018b.app/应该是本机的matlabroot。没有报错就好。原因是在代码EngineConsoleDemo.java中有import com.mathworks.engine.MatlabEngine;

    4. 运行。同样在这个文件夹

      1.  java -Djava.library.path=/Applications/MATLAB_R2018b.app/bin/maci64 -classpath .:/Applications/MATLAB_R2018b.app/extern/engines/java/jar/engine.jar EngineConsoleDemo
        
      2. 这里,需要将maci64这个文件夹添加到JRE的路径中,也需要链接engine.jar

    5. 大功告成

      1. 在这里插入图片描述
  5. 在Eclipse中测试

    1. 命令行中运行成功了,现在离成功只有一步之遥

    2. 首先需要确保Eclipse是装好了的,可以用一个Eclipse的HelloWorld程序进行测试。这里就不再赘述。和命令行中一样,我们需要的只有三点,(1)将engine放进build path,(3)将maci64这个文件夹加入到路径(3)确保使用的JRE版本是7或8

    3. 确保JRE版本。在当前project上,右键—Build Path—Configure Build Path…—弹出界面中Libraries–找到JRE System Library—Edit

      1. 在Execution environment中找到1.8,如果找不到就通过alternative JRE添加。
      2. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IgvbsFP6-1599729401476)(/Users/evanren/Pictures/typora图片/image-20200910170210963.png)]
    4. 将engine放入路径

      1. 同样在Configure Build Path…页面中点add external JARs,找到/Applications/MATLAB_R2018b.app/extern/engines/java/jar/engine.jar。保存
    5. 将maci64放入路径

      1. 同样在Configure Build Path…页面找到JRE System Library,点击左边小三角展开。找到Native Library location,单击选中,点右边的Edit …
      2. 选择External folder找到/Applications/MATLAB_R2018b.app/bin/maci64这个文件夹,保存。
    6. 运行代码,如果两个Demo程序中的Console程序有输出没有报错,GUI程序弹出窗口,点击start,输入input有反馈,就可以了。这是一个计算阶乘的程序。

      1. 在这里插入图片描述
  6. 大功告成

遇到的两个错误

  • 可以编译,但是运行的时候报错SIGSEGV,A fatal error has been detected by the Java Runtime Environment
    • 可能是版本不正确,我最开始使用JDK14的时候就报了这个错误,换成JDK8之后就没问题了
  • 找不到main
    • 这个问题在命令行和Eclipse运行的时候都遇到过,在命令行中可能是当前文件夹不对,比如该java程序在pack1/code.java这里,而且在code.java中也写了package pack1,这样的话就需要退到pack1这一层文件,通过java pack1.code这样运行
    • 而Eclipse中我还没找到怎么解决,可能也是没有把待执行文件设置对,但是如果从一个最小的Helloworld工程开始改应该是没有问题的。
  • 报错no nativemvm in java.library.path(不记得是编译还是运行时)
    • 这个是没有把/Applications/MATLAB_R2018b.app/bin/maci64添加到路径
    • 参考:https://www.mathworks.com/matlabcentral/answers/320234-using-java-api-gives-no-nativemvm-in-java-library-path
  • 弄错engine路径
    • https://www.mathworks.com/matlabcentral/answers/327681-problems-with-using-matlab-engine-api-for-java

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

  • Matlab官方的Build Java Engine Program的说明,很重要。但是这一份材料是说通过命令行执行,和Eclipse中使用还有一些距离。
    • https://www.mathworks.com/help/matlab/matlab_external/setup-environment.html#bvcubp5
    • 也是Matlab官方对Java支持的页面,但不是很有用
      • https://www.mathworks.com/help/matlab/matlab-engine-api-for-java.html?s_tid=CRUX_lftnav
      • https://www.mathworks.com/help/matlab/matlab_external/get-started-with-matlab-engine-api-for-java.html
      • https://www.mathworks.com/help/matlab/matlab_external/execute-matlab-functions-from-java.html
      • https://www.mathworks.com/help/matlab/apiref/com.mathworks.engine.matlabengine-class.html
  • 被很多相关问题回答者提到的JMI Wrapper,MatlabJava Server和MatlabControl,虽然我并没有使用到。
    • http://www.cs.virginia.edu/~whitehouse/matlab/JavaMatlab.html
  • Eclipse中设置路径 java.library.path
    • https://examples.javacodegeeks.com/java-basics/java-library-path-what-is-it-and-how-to-use/
  • 一个肯定可以用的Helloworld
    • https://www.codejava.net/ides/eclipse/how-to-create-build-and-run-a-java-hello-world-program-with-eclipse#:~:text=How%20to%20create%2C%20build%20and%20run%20a%20Java,Build%20and%20Run%20Your%20First%20Java%20Program.%20
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值