主要内容

如何MATLAB编译器SDKJava集成工作

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

此外,javabuilder软件包,提供了MATLAB和MATLAB运行时包含了MWArray类来管理在Java和MATLAB之间传递的数据。

MWArray数据转换类

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

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

MWArray层次结构

数据转换类层次结构的根是MWArray抽象类。的MWArray类有以下子类表示MATLAB的主要类型:MWNumericArrayMWLogicalArrayMWCharArrayMWCellArray,MWStructArray.每个子类存储对该类型的本机MATLAB数组的引用。

MWArray类提供以下内容:

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

  • 得到读取和写入数组数据的方法

  • 方法来标识数组的属性

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

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

请注意

的完整参考信息MWArray类层次结构,请参阅com.mathworks.toolbox.javabuilder.MWArray,它在matlabroot/帮助/工具箱/ javabuilder / MWArrayAPI /文件夹中。

自动和手动转换MATLAB类型

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

与之相反,可以使用MWArray数据转换类。当你经过一个MWArray实例作为输入参数,封装的MATLAB数组直接传递给被调用的方法。有关更多细节和示例,请参见在Java和MATLAB之间转换数据

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

使用数据转换类的优点

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

当您仅传递参数几次时,传递一个基本的Java类型或对象通常同样有效,调用机制会自动将其转换为等效的MATLAB类型。

生成的函数签名MATLAB编译器SDK

Java编程语言支持可选函数参数,与MATLAB的方法相同金宝app变长度输入宗量varargout.为了支金宝app持这个MATLAB特性,编译器生成一个重载的Java方法,该方法可以容纳任意数量的输入参数。

MATLAB函数签名

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

功能[Out1, Out2,…],varargout]= foo(In1, In2, ..., varargin)

对于等号,函数指定一组显式且可选的返回参数。

正确的对于等号,函数明确列出输入参数后跟一个或多个可选参数。

每个参数代表一个MATLAB类型。当你把变长度输入宗量varargout参数时,您可以在显式声明的输入或输出之外指定任意数量的输入或输出。

重载的方法Java封装MATLAB代码

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

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

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

请注意

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

之间的相互作用MATLAB编译器SDK和JVM

包由MATLAB编译器SDK使用Java本地接口(JNI)进行交互MATLAB运行时

当第一个MATLAB编译器SDK对象被实例化:

  1. 依赖MATLAB编译器SDK装载类。

  2. 从生成的包到JNI的一系列共享库MATLAB运行时正在加载。

  3. MATLAB运行时是通过创建一个c++类的实例来初始化的mcrInstance

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

  5. AttachCurrentThread创建一个类装入器,利用MATLAB- java接口装入MATLAB代码所需的所有类。

  6. MATLAB运行时c++ core为Java API创建的数组分配资源。

在您创建MWArray与之交互的对象MATLAB运行时, JVM为MATLAB创建一个包装器对象mxArray对象。的MATLAB运行时c++核心分配实际的资源来存储mxArray对象。这对JVM释放应用程序使用的资源的方式有影响。与MATLAB交互时使用的大部分资源是由MATLAB运行时c++的核心。JVM只能通过为它们创建的JNI包装器来了解MATLAB资源。因此,JVM不知道所消耗的资源的大小,也不能使用其内置的垃圾收集器有效地管理它们。JVM也不管理所使用的线程MATLAB运行时也无法清理干净。

所有的MATLAB编译器SDK类有静态方法来正确处理它们的资源。方法中的处置方法触发释放底层资源MATLAB运行时c++的核心。未妥善处理MATLAB编译器SDK对象可能导致不可预知的行为,并可能使您的应用程序看起来有内存泄漏。