如何将 MATLAB 源代码导出成 Java 的 JAR 包

news2025/2/4 4:01:22

文章目录

  • 编写 MATLAB 源文件
  • 安装 Java
  • 制作 JAR 包
  • 找到 MATLAB 的 JAR 包

运行环境:

  • MATLAB R2022a

  • Java 8(1.8.0_311)

  • Windows 10 教育版 64位

  使用混合编程通常都不是好主意,但是有时候会遇到极端的情况。Java 擅长网络编程,MATLAB 擅长数学高级计算与图形化。这种情况下,没办法使用一种编程语言快速完成这两项事情,因此不得不使用 Java、MATLAB 混合编程。这里提供的办法是,将一个 MATLAB 函数文件转化为 Java 的 JAR 包,然后在 Java 中运行这个 JAR 包。

  编写这个教程时,笔者已经帮读者几乎踩遍了所有常见的坑。仔细阅读本教程可以减少很多麻烦。

编写 MATLAB 源文件

  1. 这里编写了一个简单的 MATLAB 函数 matlabPlot、matlabPolarplot。这两个函数做的事情很简单,只是调用原生函数用于绘图而已。

    • matlabPlot.m
    function matlabPlot(x,y)
    plot(x,y);
    axis equal;
    
    • matlabPolarplot.m
    function matlabPolarplot(x,y)
    polarplot(x,y);
    

安装 Java

  1. 下面来开始将这个函数文件转化成 JAR 包。在这之前,需要安装 JDK。关于这方面的内容,可见笔者的另一篇博客:

    Java 的下载安装教程:
    https://blog.csdn.net/wangpaiblog/article/details/111466827


    【踩坑提醒】

    • 直到 MATLAB R2022a 时,安装的 Java 版本不能超过 8。

    • 需要将 Windows 环境变量 JAVA_HOME 的值设成 Java 8 的安装目录。

    • 配置完 Windows 环境变量后,重启 MATLAB 之后才会在 MATLAB 中生效。


制作 JAR 包

  1. 在 MATLAB 命令行窗口输入以下命令。

    deploytool

  2. 在弹出的窗口中选择 Libary Compiler。

    在这里插入图片描述

  3. 在弹出的窗口中选择 Java Package,并添加前面的 MATLAB 函数文件,然后依次填写好 Java 类名等信息,最后点击 Package 生成 JAR 包。

    在这里插入图片描述

  4. 首次打包时,需要按提示保存本次打包配置(格式为 .prj)。

  5. 打包成功会出现如图结果。如果打包失败,需查看失败日志判断原因。比方说,如果没注意笔者前面编写的 踩坑提醒,则会因为 JDK 的问题引发失败。

    在这里插入图片描述

  6. 如果打包成功,MATLAB 会在与前面打包配置文件同目录下,生成一个以配置文件名为名称的一个文件夹。该文件夹有以下文件(夹):

    • for_redistribution
    • for_redistribution_files_only
    • for_testing
    • PackagingLog.html

    这里不详细介绍各个文件的作用。我们所需要的 JAR 包在文件夹 for_redistribution_files_only 下。其它文件均可删除。

找到 MATLAB 的 JAR 包

  1. 但是,光有此 JAR 包还不能在我们自己的 Java 程序中运行。因为显然,此 JAR 包本质上只会含我们上面写的那么一点儿代码,这肯定是无法运行的。运行肯定还需要 MATLAB 自身对外提供的 SDK,也就是编程时经常所说的运行环境。不过幸运的是,这个 Java 版本的 SDK 在 MATLAB 安装的时候就已经提供了。对于笔者的 MATLAB R2022a,它在如下目录中。读者需要根据自己 MATLAB 的安装情况找到那个名为 javabuilder.jar 的 JAR 包。

    C:\Program Files\MATLAB\R2022a\toolbox\javabuilder\jar\javabuilder.jar
    
  2. 因此,这里只需要 MatlabUtil.jarjavabuilder.jar 即可在我们自己的 Java 程序中运行。


    【踩坑提醒】

      这两个 JAR 包不能在 Java 8 以上的版本运行,否则会发生如下报错:

       Exception in thread "AWT-EventQueue-0": java.lang.IllegalAccessError: superclass access check failed: class com.mathworks.hg.peer.types.HGMotifCheckMenuUI (in unnamed module @0x706bf110) cannot access class com.sun.java.swing.plaf.motif.MotifMenuUI (in module java.desktop) because module java.desktop does not export com.sun.java.swing.plaf.motif to unnamed module @0x706bf110
       	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
       	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
       	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
       	at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:524)
       	at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:427)
       	at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:421)
       	at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
       	at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:420)
       	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:587)
       	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
       	at com.mathworks.hg.peer.MenuPeer.doCreateMenu(MenuPeer.java:142)
       	at com.mathworks.hg.peer.MenuPeer.access$000(MenuPeer.java:32)
       	at com.mathworks.hg.peer.MenuPeer$1.run(MenuPeer.java:131)
       	at com.mathworks.hg.util.HGPeerQueue$HGPeerRunnablesRunner.runit(HGPeerQueue.java:290)
       	at com.mathworks.hg.util.HGPeerQueue$HGPeerRunnablesRunner.runThese(HGPeerQueue.java:318)
       	at com.mathworks.hg.util.HGPeerQueue$HGPeerRunnablesRunner.run(HGPeerQueue.java:335)
       	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
       	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
       	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
       	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
       	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
       	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
       	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
       	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
       	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
       	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
       	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
       	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
    

      Java 允许在同一个操作系统上安装多个版本的 Java。由于 Java 的 IDE 普遍支持在 IDE 中自由选择 Java 版本,所以这可能导致问题。

      如果想确认自己的 Java 程序使用的是哪个版本的 Java,可以在程序使用以下代码之一。

    System.out.println("Java 版本号:" + System.getProperty("java.version"));
    System.out.println("Java 虚拟机规范版本号:" + System.getProperty("java.vm.specification.version"));
    System.out.println("Java 规范版本号:" + System.getProperty("java.specification.version"));
    System.out.println("Java 类路径:" + System.getProperty("java.class.path"));
    System.out.println("Java lib 路径:" + System.getProperty("java.library.path"));
    System.out.println("Java 执行路径:" + System.getProperty("java.ext.dirs"));
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/21863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vivo霍金实验平台设计与实践-平台产品系列02

vivo 互联网平台产品研发团队 - Bao Dawei 本篇介绍了vivo霍金实验平台的系统架构以及业务发展过程中遇到的问题以及对应的解决方案。 《平台产品》系列文章: 1.vivo平台化实践探索之旅-平台产品系列01 一、前言 互联网企业经历过野蛮生长的开拓红利期之后&#xf…

UE4 TCP通信 (UE客户端与网络调试助手服务端、python服务端通信)

目录 一、使用UE4建立TCP客户端 二、使用网络调试助手建立服务端 三、基于网络调试助手的服务端与UE客户端通信 四、基于python的TCP服务端与UE客户端通信 一、使用UE4建立TCP客户端 1.在虚幻商城中搜索socket来下载TCP Socket Plugin插件 2.安装到引擎,目前…

面向对象分析与设计_类图

判断题 类与对象之间的关系,可以理解为模板与具体实例之间的关系 T 类是现实世界中客观存在的事物或实体。 F 类是具有相同属性和服务的一组对象的集合 T 对象的属性都有值,类的属性没有值 T 类的可见性描述了其属性和操作是否对于其他类可见&…

PHPer 开始使用 Java

出于工作需要,新项目要开始使用 Java 进行开发,注意力就要从 PHP 转移到 Java 上来。个人觉得这是一个挺好的机会,能接触被广泛使用的另一种开发语言和生态。 虽说语言之间存在许多相似之处,但真正落地的过程肯定会存在不少的曲折…

类加载与类文件结构

文章目录类加载机制为什么需要类加载类加载的时机类加载详细过程加载链接初始化类加载器类加载器的分类Java虚拟机自带的类加载器用户自定义类加载器ClassLoader的使用说明双亲委派机制沙箱安全机制类文件的结构类加载机制 为什么需要类加载 首先我们计算机的主要组成是输入设…

ES6 入门教程 15 Proxy 15.2 Proxy 实例的方法 15.2.10 ownKeys() ~ 15.2.12 setPrototypeOf()

ES6 入门教程 ECMAScript 6 入门 作者:阮一峰 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录ES6 入门教程15 Proxy15.2 Proxy 实例的方法15.2.10 ownKeys()15.2.11 preventExtensions()15.2.12 setPrototypeOf()15 Proxy 15.2 Pro…

算法题:SOJ1092: 欧几里得算法

一、BackGroud 在RSA密码体系中,欧几里得算法是加密或解密运算的重要组成部分。它的基本运算过程就是解 x*a1(mod n) 这种方程。 二、The Problem 整个解的过程是这样的,我们用一个例子来说明。 当a=1001 ,n=3837时 方程为 x *…

12 个免费 GIS 数据源介绍:最佳全球栅格和矢量数据集

我们生活在当今的信息时代,每天都被大量的信息包围,就免费的 GIS 数据源而言,它的信息似乎是永无止境的。机器学习、人工智能、区块链、预测分析,所有令人惊叹的技术都将革新商业和社会的发展。但如果没有数据的话,这些…

为了摸鱼,我开发了一个工具网站

🏡 博客首页:派 大 星 ⛳️ 欢迎关注 🐳 点赞 🎒 收藏 ✏️ 留言 🎢 本文由派大星原创编撰 🚧 系列专栏:《开源专栏》 🎈 本系列主要输出作者自创的开源项目 🔗 作品&…

“农场”技术栈是什么?浅聊FARM Stack

介绍 FARM 堆栈 - FastAPI、React 和 MongoDB。 长按关注《Python学研大本营》,加入读者群,分享更多精彩 扫码关注《Python学研大本营》,加入读者群,分享更多精彩 当我获得第一份编程工作时,LAMP(Linux、A…

[附源码]java毕业设计万科电子商城

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【毕业设计】22-基于单片机的智能温度计的系统设计(原理图工程+仿真工程+源代码+仿真视频+答辩论文+答辩PPT)

【毕业设计】22-基于单片机的智能温度计的系统设计(原理图工程仿真工程源代码仿真视频答辩论文答辩PPT)[toc] 资料下载链接 资料下载链接 资料链接:https://www.cirmall.com/circuit/28616/ 包含此题目毕业设计全套资料: 基于单…

029-Swing实现简单计算器功能

https://blog.csdn.net/software7503/article/details/127952712https://blog.csdn.net/software7503/article/details/127952712上一讲:028-GUI事件处理,ActionListener事件,MouseListener事件 下一讲:030-用Swing组件及Action事件实现登录功能_CS

UNCTF2022 writeup

题量太多了,比赛结束之后又要做一遍… 注:最后给出的均为题目解出的flag,提交时需将格式修改为UNCTF{} 文章目录Web我太喜欢bilibili大学啦ezgame签到babyphpeasy_upload给你一刀我太喜欢bilibili大学啦修复版302与深大随便注PwnwelcomeUNCT…

企业日志分析ELK(Logstash+Elasticsearch+Kibana)介绍及搭建

一、ELK概述 1、ELK日志分析系统 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch: ElasticSearch:是…

Linux:进程(一)

文章目录前言一、进程是什么二、描述进程--PCB三、查看进程四、通过系统调用获取进程标示符五、通过系统调用创建进程-fork初识六、进程状态七、进程状态查看八、僵尸进程(Z:zombie)1.是什么2.为什么3.怎么避免九、孤儿进程十、进程优先级十一…

内蒙古简易医院企业网设计与规划

目 录 摘 要 1 Abstract 2 第1章 绪论 5 1.1 背景及意义 5 1.2 国内外研究现状 6 1.2.1 国外研究现状 7 1.2.2 国内研究现状 7 1.3研究内容 8 第2章 医院企业网需求分析 9 2.1医院基本情况 9 2.1.1基本情况 9 2.1.2建筑楼群及信息点分布图 9 2.2需求需求 10 2.2.1管理需求 10 2…

Matlab下载安装详细教程

下载链接:https://pan.baidu.com/s/19JbPP2hWlZraVbLuNlHpcg 提取码:6666 下载网盘链接是公众号“电脑DIY圈”里的分享,不是博主自己的,另外此安装教程同样来自电脑DIY圈公众号,博主仅做整理,以便日后需要 …

图 知识点总结(王道)

图的定义 图G由顶点集V和边集E组成,记为G(V,E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)集合。若V{v1,v2vn},则用|V…

asp开发的人脸识别:人脸照片+身份证号+姓名,核验实人认证

今天接到一个客户需求,要求用asp开发人脸识别功能,主要用于网站上用户的实人核验,用户上传照片后,通过照片姓名身份证号码,核验是不是一个人,判断用户的真实性。asp写这个其实很简单,经过一个小…