java 调用 matlab 程序说明


java 调用 matlab 程序说明

系统配置

  • matlab版本:R2017a

  • 数据库:MySQL 5.7

    • 如何查看mysql版本号? 命令行中输入

      mysql -u root -p

      然后输入密码,即可看到版本号。

  • mysql-connector-java-5.1.47-bin.jar (MySQL Connector/J)

  • mysql-connector-java-5.1.47.jar (MySQL Connector/J)

  • javabuilder.jar (java for matlab运行包,位于MATLAB\R2017a\toolbox\javabuilder\jar)
    编译依赖必须满足以上版本要求,若matlab版本更新,javabuilder需要和matlab版本保持一致;由于matlab内使用的MySQL Connector/J为5.1.47,编译时需要版本一致,实测编译使用MySQL Connector/J 8.0版本会报错。

环境搭建

  1. 安装matlab 2017a

  2. mysql-connector-java-5.1.47-bin.jar 和 mysql-connector-java-5.1.47.jar 两个文件拷贝到matlab的工具箱文件夹中D:\Matlab2017a\java\jar\toolbox(我这里安装在D盘,需调整到自己电脑安装位置)

  3. D:\Matlab2017a\toolbox\local 文件夹下找到 classpath.txt 文件,双击打开,添加以下内容:

    $matlabroot/java/jar/toolbox/mysql-connector-java-5.1.47.jar
    $matlabroot/java/jar/toolbox/mysql-connector-java-5.1.47-bin.jar
  4. 重启matlab, 在命令行窗口中输入

conn = database('test', 'root', '123456', 'com.mysql.jdbc.Driver', 'jdbc:mysql://localhost:3306/test')

其中test是数据库名,root是连接mysql的用户名,’123456’是密码,按回车键,’com.mysql.jdbc.Driver’是mysql驱动,’jdbc:mysql://localhost:3306/test’ 是想要访问的 url.

弹出上图所示信息,OK,环境搭建成功!

  1. 可能出现的问题及处理办法:==未定义与’struct’ 类型的输入参数相对应的函数’fetch’==
    i. 注意URL,不能带参数,如jdbc:mysql://localhost:3306/logistics?useUnicode=true&characterEncoding=UTF-8
    ii. MySQL Connector/J 版本不对

Matlab程序转jar包

  1. APP –> Library Compiler

  1. 接着弹出如下界面,按图中序号操作

添加后的效果如图,然后自定义包名类名,这里类名命名为 Entry1,因为不能与方法同名(方法中有 Entry)

  1. 点击上图中 上方最右侧的 Package,打包

  2. 打开输出文件夹

java调用jar包示例

  1. 首先利用 IDEA 新建一个项目,将目标文件拷贝到新建项目的 src 目录下

  1. 添加进依赖

完成上述步骤后,发现有三角标志,意味着可以直接使用。

image-20201224210344637

  1. 同样,将 javabuilder.jar 和 mysql-connector-java-5.1.47.jar 用上述步骤引入依赖。其中,

    • javabuilder.jar:该文件用于java调用matlab文件
    • mysql-connector-java-5.1.47.jar:数据库驱动
  2. 打开 javaCallMatlab 包目录,可发现里面有我们之前打包时定义的类:Entry1, 可以直接拿来用。

  3. 打开Entry1的源码,发现里面有我们在Matlab里定义的所有函数。

    public class Entry1 extends MWComponentInstance<Entry1> {
        private static final Set<Disposable> sInstances = new HashSet();
        private static final MWFunctionSignature sAddZeroSignature = new MWFunctionSignature(1, false, "addZero", 1, false);
        private static final MWFunctionSignature sCalCostSignature = new MWFunctionSignature(1, false, "CalCost", 2, false);
        private static final MWFunctionSignature sClassProcSignature = new MWFunctionSignature(3, false, "ClassProc", 4, false);
        private static final MWFunctionSignature sDeleteOrderSignature = new MWFunctionSignature(1, false, "DeleteOrder", 1, false);
        private static final MWFunctionSignature sDemandProcSignature = new MWFunctionSignature(1, false, "DemandProc", 3, false);
        private static final MWFunctionSignature sEarliestTruckSignature = new MWFunctionSignature(1, false, "EarliestTruck", 1, false);
        private static final MWFunctionSignature sEntrySignature = new MWFunctionSignature(1, false, "Entry", 7, false);
        private static final MWFunctionSignature sFixSolSignature = new MWFunctionSignature(1, false, "FixSol", 1, false);
        private static final MWFunctionSignature sFixSol2Signature = new MWFunctionSignature(1, false, "FixSol2", 1, false);
        private static final MWFunctionSignature sFormatDateSignature = new MWFunctionSignature(1, false, "FormatDate", 1, false);
        private static final MWFunctionSignature sGenConseSolSignature = new MWFunctionSignature(3, false, "GenConseSol", 6, false);
        private static final MWFunctionSignature sGenIndSolSignature = new MWFunctionSignature(5, false, "GenIndSol", 6, false);
        private static final MWFunctionSignature sGetclosecabinSignature = new MWFunctionSignature(2, false, "getclosecabin", 2, false);
        private static final MWFunctionSignature sGetclosetotalvolumeSignature = new MWFunctionSignature(1, false, "getclosetotalvolume", 2, false);
        private static final MWFunctionSignature sGetdistanceSignature = new MWFunctionSignature(1, false, "getdistance", 3, false);
        private static final MWFunctionSignature sGetloadinfoSignature = new MWFunctionSignature(1, false, "getloadinfo", 2, false);
        private static final MWFunctionSignature sGetmaxsinglevolumeSignature = new MWFunctionSignature(2, false, "getmaxsinglevolume", 1, false);
        private static final MWFunctionSignature sGetmaxtotalvolumeSignature = new MWFunctionSignature(3, false, "getmaxtotalvolume", 1, false);
        private static final MWFunctionSignature sGetplanSignature = new MWFunctionSignature(1, false, "getplan", 2, false);
        private static final MWFunctionSignature sGetunprocessedorderSignature = new MWFunctionSignature(1, false, "getunprocessedorder", 2, false);
        private static final MWFunctionSignature sJudgeOilSignature = new MWFunctionSignature(3, false, "JudgeOil", 5, false);
        private static final MWFunctionSignature sJudgeReceivableTimeSignature = new MWFunctionSignature(1, false, "JudgeReceivableTime", 2, false);
        private static final MWFunctionSignature sNewTruckNumSignature = new MWFunctionSignature(1, false, "NewTruckNum", 2, false);
        private static final MWFunctionSignature sOrderProcSignature = new MWFunctionSignature(1, false, "OrderProc", 1, false);
        private static final MWFunctionSignature sOrderSortSignature = new MWFunctionSignature(2, false, "OrderSort", 2, false);
        private static final MWFunctionSignature sRandTruckChoiceSignature = new MWFunctionSignature(3, false, "RandTruckChoice", 1, false);
        private static final MWFunctionSignature sSavetosqlSignature = new MWFunctionSignature(0, false, "savetosql", 6, false);
        private static final MWFunctionSignature sSinDelayProc1Signature = new MWFunctionSignature(5, false, "SinDelayProc1", 5, false);
        private static final MWFunctionSignature sSinDelayProc2Signature = new MWFunctionSignature(5, false, "SinDelayProc2", 5, false);
        private static final MWFunctionSignature sSinProc1Signature = new MWFunctionSignature(5, false, "SinProc1", 4, false);
        private static final MWFunctionSignature sSinProc2Signature = new MWFunctionSignature(5, false, "SinProc2", 5, false);
        private static final MWFunctionSignature sStrSplitSignature = new MWFunctionSignature(1, false, "StrSplit", 2, false);
        private static final MWFunctionSignature sTruckProc1Signature = new MWFunctionSignature(1, false, "TruckProc1", 1, false);
        private static final MWFunctionSignature sTruckProc2Signature = new MWFunctionSignature(1, false, "TruckProc2", 1, false);
        private static final MWFunctionSignature sTruckSortSignature = new MWFunctionSignature(2, false, "TruckSort", 1, false);
        private static final MWFunctionSignature sTruckTimeProcSignature = new MWFunctionSignature(1, false, "TruckTimeProc", 1, false);
    }
  4. 调用Entry1

编写Test测试类

package MyJframetest;

import com.mathworks.toolbox.javabuilder.MWCharArray;
import com.mathworks.toolbox.javabuilder.MWException;
import com.mathworks.toolbox.javabuilder.MWLogicalArray;
import com.mathworks.toolbox.javabuilder.MWNumericArray;
import javaCallMatlab.Entry1;

/**
 * @author Allen
 * @date 2020/12/24 21:04
 */
public class Test {


    public static void main(String[] args) {
        //matlab  Entry()函数入参
        MWCharArray district_no = new MWCharArray("Z01");
        MWCharArray order_date = new MWCharArray("2019-07-21");
        MWCharArray user_name = new MWCharArray("root");
        MWCharArray password = new MWCharArray("1005");
        MWCharArray URL = new MWCharArray("jdbc:mysql://localhost:3306/915logistics");
        MWLogicalArray update = new MWLogicalArray(true);
        MWLogicalArray local = new MWLogicalArray(false);

        // Entry1 为打包时的类名
        Entry1 test = null;
        try {
            test = new Entry1();
        } catch (MWException e) {
            e.printStackTrace();
        }

        Object[] obj = new Object[0];
        try {
            //调用 Entry 方法, Entry()为 matlab 程序进入数据库的入口
            obj = test.Entry(1,district_no,order_date,user_name,password,URL,update,local);
        } catch (MWException e) {
            e.printStackTrace();
        }

        MWNumericArray state=(MWNumericArray)obj[0];
        if(state.getInt()==2)
        { System.out.println("成功!");}

        CreateTable a = new CreateTable();
        a.createtable();
    }
}

输出如下信息:

OK,测试成功!

参考

1.https://ww2.mathworks.cn/help/compiler_sdk/gs/create-a-java-application-with-matlab-code.html
2.https://dev.mysql.com/downloads/connector/j/5.1.html
3.https://ww2.mathworks.cn/help/javabuilder/MWArrayAPI/com/mathworks/toolbox/javabuilder/package-summary.html


文章作者: Hailong Gao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hailong Gao !
评论
  目录