选择 Java 部署选项
MATLAB® Compiler SDK™ 提供了两种在 Java® 应用程序中部署 MATLAB 函数的方法:
使用 MATLAB Data API for Java 部署到 Java 应用程序 (自 R2026a 起)
使用
MWArrayAPI 将应用程序部署到 Java
由于 MATLAB Compiler SDK 提供了两个 Java 应用程序 API 用于与已部署的 MATLAB 函数交互,因此这两种部署选项的区别在于 Java 应用程序与已部署的 MATLAB 函数之间用于交换数据的 API。
选择 Java 的部署选项,关键在于了解每种选项的功能,并判断这些功能如何满足您的开发需求。这两个选项都提供了一套全面的 API,用于处理应用程序管理和数据操作。
MATLAB Data API for Java 相较于 MWArray API 的优势
MathWorks® 建议在向 Java 应用程序部署时,使用更现代的 MATLAB Data API(适用于 Java)而非 MWArray API。与 MWArray API 相比,使用 MATLAB Data API for Java 的优势在于:
MATLAB Runtime 实例可以相对于 Java 应用程序在进程内或进程外运行,而部署的 MATLAB 函数可以同步或异步执行。
线程安全设计有助于跨多个线程并发创建和使用数据,而无需使用锁定机制。这会提高性能,特别是在多个线程中对 MATLAB 数据进行大量、密集的操作时。
现在,基于 Java 的 MATLAB Engine 应用程序与部署的 MATLAB 应用程序之间的转换便可轻松完成。
支持跨平台开发和部署。
生成工件的差异
当您将 MATLAB 函数或类作为参数传递给 compiler.build.javaPackage 函数或 Java 包编译器应用程序时,这两种部署选项生成的主要输出结果是不同的。
假设您有一个名为 calculateDistance 的 MATLAB 的函数,该函数存储在名为 calculateDistance.m 的文件中,并且您希望将其集成到 Java 应用程序中,让我们来看看两种部署方案的结果:
function distance = calculateDistance(p1, p2) % This function calculates the Euclidean distance between two points % Inputs: % p1 - a two-element vector [x, y] % p2 - a two-element vector [x, y] % Output: % distance - the Euclidean distance between p1 and p2 % Calculte Euclidean distance diff = p1 - p2; diffSq = diff.^2; sumSq = sum(diffSq); distance = sqrt(sumSq); end
当您将 calculateDistance.m 文件作为参数传递给 compiler.build.javaPackage 函数时,默认会使用 MWArray API。要使用 MATLAB Data API for Java,您需要使用名称-值对 Interface="matlab-data" 显式指定接口类型。
buildResults = compiler.build.javaPackage( ... "calculateDistance.m",... Verbose="on", OutputDir=".\output_mwa",... PackageName="com.example.matlabfunction") | buildResults = compiler.build.javaPackage( ... "calculateDistance.m",... Interface="matlab-data",... Verbose="on", OutputDir=".\output_mda",.... PackageName="com.example.matlabfunction") |
该函数在指定文件夹中为两个 API 生成相应的文件:
P:\MATLAB\WORK\OUTPUT_MWA │ mccExcludedFiles.log │ includedSupportPackages.txt │ matlabfunction.jar │ requiredMCRProducts.txt │ unresolvedSymbols.txt │ GettingStarted.html │ buildresult.json │ readme.txt │ ├───doc │ ├───com │ └───example │ └───matlabfunction │ package-info.java │ MatlabfunctionMCRFactory.java │ calculateDistanceClassRemote.java │ calculateDistanceClass.java │ └───classes └───com └───example └───matlabfunction matlabfunction.ctf calculateDistanceClassRemote.class calculateDistanceClass.class MatlabfunctionMCRFactory.class | P:\MATLAB\WORK\OUTPUT_MDA
includedSupportPackages.txt
matlabfunction.ctf
mccExcludedFiles.log
unresolvedSymbols.txt
readme.txt
GettingStarted.html
buildresult.json
requiredMCRProducts.txt
No subfolders exist |
MWArray API 工作流
在 MWArray API 工作流中,当您在 MATLAB 中运行 compiler.build.javaPackage 命令时,主要输出之一是 matlabfunction.jar 文件。文件名取自包名的最后一部分,例如 com.example.matlabfunction,它是用于在 Java 应用程序中调用 MATLAB 函数的主要交付成果。此 JAR 文件的内容反映了构建过程中创建的 classes 文件夹的结构。两者都包含编译后的 Java 类和 matlabfunction.ctf 存档文件,并按指定的包进行组织。
原始的 MATLAB 文件(例如 calculateDistance.m)定义了计算逻辑。该逻辑被封装到一个 .ctf 文件中,随后该文件连同自动生成的 Java 类一起捆绑到 JAR 文件中。这些类负责加载 .ctf 存档文件、管理 MATLAB Runtime,并提供 Java 友好方法,使 MATLAB 函数可供 Java 代码使用。
MATLAB Data API for Java 工作流
在 MATLAB Data API for Java 的工作流中,compiler.build.javaPackage 函数会生成一个 matlabfunction.ctf 文件,但不会生成包含 Java 包装类的 JAR 文件。相反,该工作流依赖于 matlabruntime.jar,这是一个由 MathWorks 作为 MATLAB Compiler SDK 的一部分提供的 Java 存档文件。
matlabruntime.jar 提供了核心的 Java API,使 Java 应用程序能够加载封装在 .ctf 文件中的打包 MATLAB 代码并与之交互。
文件名 matlabfunction.ctf 源自指定包名的最后一个部分,例如 com.example.matlabfunction。
与 MWArray 工作流不同,后者会生成一个工程专用的 JAR 文件,其中既包含打包后的 MATLAB 代码,也包含可直接使用的 Java 包装类;而 MATLAB Data API for Java 则将打包后的代码(.ctf 文件)与 matlabruntime.jar 中指定过的 API 分离,从而为将 MATLAB 与 Java 集成提供了更现代的方法。