主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

MATLAB Compiler SDK Java 集成的工作原理

当您使用 MATLAB® Compiler SDK™ 创建 Java® 包时,编译器会加密您的 MATLAB 函数并生成一个或多个包装您的 Java 函数的 MATLAB 类。这些类提供的方法允许您像调用任何其他 Java 方法一样调用函数。

此外,MATLAB 和 MATLAB Runtime 提供了 javabuilder 包,其中包含 MWArray 类,该类可以管理在 Java 和 MATLAB 之间传递的数据。

MWArray 数据转换类

编写 Java 应用程序时,您可以使用任何 MWArray 数据转换类的对象来表示数据。或者,您可以使用标准 Java 数据类型和对象。

MWArray 数据转换类构建为代表主要 MATLAB 数组类型的类层次结构。

MWArray 层次结构

数据转换类层次结构的根是 MWArray 抽象类。MWArray 类具有以下代表主要 MATLAB 类型的子类:MWNumericArrayMWLogicalArrayMWCharArrayMWCellArrayMWStructArray。每个子类都存储对该类型的 MATLAB 原生数组的引用。

MWArray 类提供以下内容:

  • 用于实例化和处置 MATLAB 数组的构造函数和终结器

  • getset 方法来读取和写入数组数据

  • 识别数组属性的方法

  • 比较方法来测试数组的相等性或顺序

  • 转换为其他数据类型的转换方法

注意

有关 MWArray 类层次结构的完整参考信息,请参阅 com.mathworks.toolbox.javabuilder.MWArray,位于 matlabroot/help/toolbox/javabuilder/MWArrayAPI/ 文件夹中。

自动和手动转换为 MATLAB 类型

如果您的 Java 代码使用本机 Java 原语或数组作为输入参数,则编译器会在将其传递给方法之前自动将其转换为适当的 MWArray 类的实例。编译器可以将任何 Java 字符串、数值类型或这些类型的多维数组转换为适当的 MWArray 类型。

相反,您可以使用 MWArray 数据转换类手动将 Java 数据类型转换为标准 MATLAB 数据类型之一。当您将 MWArray 实例作为输入参量传递时,封装的 MATLAB 数组将直接传递给被调用的方法。有关更多详细信息和示例,请参阅在 Java 和 MATLAB 之间转换数据

有关 MATLAB 中支持的所有数据类型及其等效类型的列表,请参阅Java 与 MATLAB 之间的数据转换规则

使用数据转换类的优势

MWArray 数据转换类允许您直接传递本机类型参数,而无需使用显式数据转换。如果您频繁传递相同的数组,则可以通过将该数组存储在 MWArray 子类之一的实例中来提高程序的性能。

当您仅传递几次参量时,传递原始 Java 类型或对象通常同样高效,调用机制会自动将其转换为等效的 MATLAB 类型。

MATLAB Compiler SDK 生成的函数签名

Java 编程语言支持可选函数参量,就像 MATLAB 使用 vararginvarargout 一样。为了支持此 MATLAB 特性,编译器生成一个可容纳任意数量输入参量的单一重载 Java 方法。

MATLAB 函数签名

通用 MATLAB 函数具有以下结构:

function [Out1, Out2, ..., varargout]=
           foo(In1, In2, ..., varargin)

在等号左边,函数指定了一组显式和可选的返回参量。

在等号的右边,函数列出了显式的输入参量,后跟一个或多个可选参量。

每个参量代表一种 MATLAB 类型。当您包含 vararginvarargout 参量时,您可以指定除明确声明的输入或输出之外的任意数量的输入或输出。

Java 中封装 MATLAB 代码的重载方法

MATLAB Compiler SDK 封装您的 MATLAB 代码时,它会创建一个实现 MATLAB 函数的重载方法。此重载方法对应于对输入参量的可能数量和类型的每个组合调用通用 MATLAB 函数。

除了封装输入参量之外,编译器还创建了另一种方法来表示 MATLAB 函数的输出参量。这种封装返回值信息的方法类似于为 C/C++ MATLAB Compiler SDK 目标生成的 mlx 接口。

这些重载方法被称为标准接口和 mlx 接口。有关详细信息,请参阅MATLAB Compiler SDK 生成的编程接口

注意

向数据结构和数据结构体数组添加字段时,请使用标准编程技术。不要使用 set 命令作为快捷方式。

MATLAB Compiler SDK 与 JVM 之间的交互

MATLAB Compiler SDK 生成的包使用 Java 本机接口 (JNI) 与 MATLAB Runtime 交互。

当第一个 MATLAB Compiler SDK 对象实例化时:

  1. 已加载相关的 MATLAB Compiler SDK 类。

  2. 加载了一系列共享库,形成从生成的包到 MATLAB Runtime 的 JNI 桥梁。

  3. MATLAB Runtime 通过创建名为 mcrInstance 的 C++ 类实例进行初始化。

  4. MATLAB - Java 接口通过调用 JNI 方法 AttachCurrentThread 建立与 JVM® 的连接。

  5. AttachCurrentThread 利用 MATLAB - Java 接口创建一个类加载程序,它可以加载 MATLAB 代码所需的所有类。

  6. MATLAB Runtime C++ 核心为 Java API 创建的数组分配资源。

当您创建 MWArray 对象以与 MATLAB Runtime 交互时,JVM 会为 MATLAB mxArray 对象创建一个包装器对象。MATLAB Runtime C++ 核心分配实际资源来存储 mxArray 对象。这会影响 JVM 如何释放应用程序使用的资源。与 MATLAB 交互时使用的大部分资源都是由 MATLAB Runtime C++ 核心创建的。JVM 仅通过为其创建的 JNI 包装器了解 MATLAB 资源。因此,JVM 不知道所消耗资源的大小,并且无法使用其内置的垃圾收集器有效地管理它们。JVM 也不管理 MATLAB Runtime 使用的线程,也无法清理它们。

所有 MATLAB Compiler SDK 类都有静态方法来正确处理其资源。处置方法触发释放 MATLAB Runtime C++ 核心中的底层资源。如果不正确处理 MATLAB Compiler SDK 对象,可能会导致不可预测的行为,并且可能看起来像您的应用程序有内存泄漏。