macOS Mojave上Matlab 2018a与Java的联合编程

一、安装Matlab和MCR

  1. 自行安装 Matlab 2018a,建议设置为英文。因为 MCR 默认编码不是 UTF-8,而且貌似不能修改。否则后面的异常信息会出现乱码。
  1. 下载并安装对应的 Matlab Compiler Runtime
  1. 在目标计算机上,将以下内容追加到环境变量 DYLD_LIBRARY_PATH 的末尾。
1
/Applications/MATLAB/MATLAB_Runtime/v94/runtime/maci64:/Applications/MATLAB/MATLAB_Runtime/v94/sys/os/maci64:/Applications/MATLAB/MATLAB_Runtime/v94/bin/maci64:/Applications/MATLAB/MATLAB_Runtime/v94/extern/bin/maci64  
  1. 非常重要:重启,command+R进入恢复模式,csrutil disable 关闭 SIP。

二、配置Java环境

  1. Matlab 命令窗口输入以下代码查看 Java 版本号。
1
version -java
  1. 从以下网址下载对应的 JDK ,这里对应的是 Java SE Development Kit 8u144Java SE 8 Archive Downloads
  1. 执行下载好的 JDK 安装包,安装完成的路径为 /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk

  2. 配置 JAVA_HOME 环境变量,在Mac终端上执行以下代码。

1
2
3
4
5
6
7
8
9
cd ~
vim .bash_profile 
# 按i进行编辑,添加以下语句
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
export DYLD_LIBRARY_PATH=/Applications/MATLAB/MATLAB_Runtime/v94/runtime/maci64:/Applications/MATLAB/MATLAB_Runtime/v94/sys/os/maci64:/Applications/MATLAB/MATLAB_Runtime/v94/bin/maci64:/Applications/MATLAB/MATLAB_Runtime/v94/extern/bin/maci64

export CLASSPATH=.:/Applications/MATLAB_R2018a.app/toolbox/javabuilder/jar/
# 保存之后,更新配置文件
source .bash_profile 
  1. 查看环境是否生效。
1
2
3
4
5
java -version  

java version "1.8.0_144"  
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)  
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
  1. 备注:Mac 中的 JDK 和 Matlab 中的在大版本上必须一致, 小版本可以不相同

三、将 m 文件 Complie 为 jar

  1. 以下路径找到示例函数 makesqr.m,添加到 Matlab 工作目录。
1
/Applications/MATLAB_R2018a.app/toolbox/javabuilder/Examples/MagicSquareExample/MagicDemoComp/makesqr.m
  1. 命令行输入 deploytool, 选择 Library Compiler
  1. 添加m函数,修改类名,Package。
  1. 在输出文件夹可以找到 makesqr.jar

四、在 IDEA 中运行

  1. 新建一个模块, Project SDK 设置为1.8。
  1. 在以下文件夹找到 javabuilder.jar
1
/Applications/MATLAB_R2018a.app/toolbox/javabuilder/jar
  1. makesqr.jarjavabuilder.jar 放在 lib 包下, Add as library
  1. 编写一个类进行测试。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import com.mathworks.toolbox.javabuilder.MWException;
import makesqr.MakeSqr;

public class TestMatlab2Java {
    public static void main(String[] args) throws MWException {
        MakeSqr makeSqr = new MakeSqr();
        
        // 第一个参数1表示makesqr()方法只有一个返回值, 不可以省略
        // 第二个参数3表示原来Matlab中makesqr()方法的参数为3
        Object[] squareArr = makeSqr.makesqr(1, 3);
        
        for (Object square : squareArr) {
            System.out.println(square);
        }
    }
}
  1. 执行的结果和 Matlab 中的结果一致。
1
2
3
8     1     6
3     5     7
4     9     2

参考文章

  1. Configure Your Java Environment
  2. Set Run-Time Library Path on Mac Systems
  3. MCR with MAC and environment Variable
  4. LD_LIBRARY_PATH and DYLD_LIBRARY_PATH not imported on OS X #1523
  5. Create a Java Package with MATLAB Code
  6. 设置java.library.path的值(Mac/Linux/Windows)
  7. Mac OS增删环境变量
  8. 64位 JDK 1.8 调用Matlab 2017b打包的jar
  9. Java调用Matlab函数以及同时配置多版本JDK的方法