matlab程序打包成jar包,IDEA实现java调用matlab程序

本文将分为三部分展开,有matlab程序打包成jar包,添加jar包到IDEA并调用,遇到的错误解决办法说明。

一. matlab程序打包成jar包
1.环境说明
系统:window7 64位 jdk1.7
matlab版本:matlab2016a 64位 jdk1.7
注意:必须要保证matlab的位数和jdk版本与系统一致(大版本一致即可,如都是1.7或1.6,后面的数字可以不一样)
2.环境查看
首先判断matlab jdk版本,在命令行输入 version -java 结果为 64位,jdk1.7
matlab程序打包成jar包,IDEA实现java调用matlab程序_第1张图片
查看系统jdk版本,程序-> cmd -> java -version 结果为64位, jdk1.7
matlab程序打包成jar包,IDEA实现java调用matlab程序_第2张图片
3.matlab编写m文件
新建一个m文件,构造成函数并保存。如下
matlab程序打包成jar包,IDEA实现java调用matlab程序_第3张图片
在命令行输入 deploytool ,弹出窗口 选择 Library Compiler 用来打包成jar包
matlab程序打包成jar包,IDEA实现java调用matlab程序_第4张图片
左上角选择 Java Package,添加m文件,修改Class Name中的 文件名为SumFunction,最后点击Package完成打包。
matlab程序打包成jar包,IDEA实现java调用matlab程序_第5张图片
打包完成后,可在D:\Program Files\MATLAB\R2016a\bin\sumTest\for_redistribution_files_only 看到有一个sumTest.jar,这就是我们要的结果。
matlab程序打包成jar包,IDEA实现java调用matlab程序_第6张图片
二. 添加jar包到IDEA并调用
1.添加jar包
除了添加matlab生成后的sumTest.jar包外,还要添加matlab自带的javabuilder.jar包(路径:D:\Program Files\MATLAB\R2016a\toolbox\javabuilder\jar),因为是matlab打包的jar包,需要依赖matlab中的相关函数。
IDEA中,点击 File->Project Structure->Project Settings -> Libraries 添加上面两个包。
matlab程序打包成jar包,IDEA实现java调用matlab程序_第7张图片
注意:此次的项目工程的jdk版本也要和matlab版本一致,否则程序运行会报错。
2.调用matlab函数
在java项目中引用生成的matlab.jar和javabuilder.jar。测试代码如下:

package com.xy;
import com.mathworks.toolbox.javabuilder.MWException;
import sumTest.SumFunction;

/**
 * Created by Administrator on 2018/10/15.
 */
 //matlab方法为[c] = sumTest(a,b)
//java中方法为matlab实例的方法matlab.sumTest(int,object...),返回值为object[]
//其中输入的int为输出的个数,object...为输入参数,返回值object[]为输出的集合

public class MatlabTest {
    public static void main(String args[]){
        try {
            SumFunction sumFunction = new SumFunction(); //实例化方法
            Object[] a = sumFunction.sumTest(1,1,2);
            System.out.print("java调用matlab函数运行结果:");
            System.out.print(a[0]);
        } catch (MWException e) {
            e.printStackTrace();
        }
    }
}

运行结果:
matlab程序打包成jar包,IDEA实现java调用matlab程序_第8张图片
3.调用过程说明
(a) matlab生成的jar包中的类在创建时会可能出错,会抛出MWException异常,故创建类时必须用try catch。
(b) 使用包的方法时,会出现多个方法,每个方法的输入输出参数类型不是与对应的m文件中的function一一对应的,所以不能像matlab中那样直接使用,一般情况下选择返回为Object[]对应的类。
© 方法中的参数与matlab定义不对应,如上代码,sumTest方法多了一个参数,这个参数用来表示输出的个数,即函数变量的输出c,如果sumTest的function为function[c,d],要想输出d的运行结果,这时的sumTest的第一个参数要为2。默认情况下,都是为1,不写的话会报“输入参数的数目不足。”的错误。

三. 遇到的错误解决办法说明
在java调用matlab的jar包过程中,最容易报错是:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the required library mclmcrrt9_0_1.dll 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: 9.0.

该错误有以下几种可能:

  1. matlab中没有安装MCR,需要安装MCR,MCR路径在D:\Program Files\MATLAB\R2016a\toolbox\compiler\deploy\win64,,找到该文件双击进行安装,如果之前存在这个文件就先卸载再安装,安装成功后重启电脑即可。
    2.如果安装完,仍然报该错误,可以尝试将dll文件放到项目的lib目录下。
    3.还有一种容易被忽略的解决方法, 有可能就是因为项目工程的jdk版本与matlab的jdk版本不一致导致报错(我就是这种情况)。

参考文章:
1.https://blog.csdn.net/qq_19865749/article/details/68556902
2.https://blog.csdn.net/monkey131499/article/details/48786121
3.https://blog.csdn.net/qq_19865749/article/details/68932949
4.https://blog.csdn.net/jinliwei1990/article/details/55505133

你可能感兴趣的:(java,matlab)