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版本会报错。
环境搭建
安装matlab 2017a
将 mysql-connector-java-5.1.47-bin.jar 和 mysql-connector-java-5.1.47.jar 两个文件拷贝到matlab的工具箱文件夹中D:\Matlab2017a\java\jar\toolbox(我这里安装在D盘,需调整到自己电脑安装位置)
在 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
重启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,环境搭建成功!
- 可能出现的问题及处理办法:==未定义与’struct’ 类型的输入参数相对应的函数’fetch’==
i. 注意URL,不能带参数,如jdbc:mysql://localhost:3306/logistics?useUnicode=true&characterEncoding=UTF-8
ii. MySQL Connector/J 版本不对
Matlab程序转jar包
- APP –> Library Compiler
接着弹出如下界面,按图中序号操作
添加后的效果如图,然后自定义包名和类名,这里类名命名为 Entry1,因为不能与方法同名(方法中有 Entry)
点击上图中 上方最右侧的 Package,打包
打开输出文件夹
java调用jar包示例
- 首先利用 IDEA 新建一个项目,将目标文件拷贝到新建项目的 src 目录下
添加进依赖
完成上述步骤后,发现有三角标志,意味着可以直接使用。
同样,将 javabuilder.jar 和 mysql-connector-java-5.1.47.jar 用上述步骤引入依赖。其中,
- javabuilder.jar:该文件用于java调用matlab文件
- mysql-connector-java-5.1.47.jar:数据库驱动
打开 javaCallMatlab 包目录,可发现里面有我们之前打包时定义的类:Entry1, 可以直接拿来用。
打开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); }
调用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