表示本机 Java 单元和结构体数组
Java® 没有可用于 MATLAB® 结构体数组和元胞数组的直接表示。因此,当使用 MWStructArray 方法将 MWCellArray 或 toArray() 的实例转换为 Java 本机类型时,输出是一个多维 Object 数组,这可能很难处理。
当您将 MATLAB Compiler SDK™ 包与 RMI 结合使用时,您可以控制服务器如何将 MATLAB 函数调用的结果发送回客户端。可以将服务器设置为将输出作为 MWArray(com.mathworks.toolbox.javabuilder 包)子类型或 Java 本机数据类型编组到客户端。MWArray 子类型的 Java 本机数据类型表示是通过服务器调用 toArray() 方法获得的。
如果以下两个条件都成立,则可以使用 Java 结构和元胞数组的 MATLAB 本机表示:
您在服务器上拥有 MATLAB 函数,并以 MATLAB 结构或单元数据类型作为输入或输出
您不想在客户端计算机上安装 MATLAB Runtime
com.mathworks.extern.java 包(在 javabuilder.jar 中)中的类不需要 MATLAB Runtime。此包中类的名称与 com.mathworks.toolbox.javabuilder 中的类名称相同 - 允许您在没有 MATLAB Runtime 的计算机上轻松创建 com.mathworks.extern.java.MWStructArray 或 com.mathworks.extern.java.MWCellArray 的实例,其工作方式与 com.mathworks.toolbox.javabuilder 中同名类相同。
由于 MWArray 类层次结构只能与 MATLAB Runtime 一起使用,如果客户端计算机没有可用的 MATLAB Runtime,则服务器将分别将结构或元胞数组的 toArray() 输出作为 com.mathworks.extern.java.MWStructArray 或 com.mathworks.extern.java.MWCellArray 的实例返回。
前提条件
要运行此示例,您的环境必须满足以下前提条件:
在开发计算机上安装 MATLAB Compiler SDK。
在开发计算机上安装受支持的 Java 开发工具包 (JDK™) 版本。有关详细信息,请参阅配置用于生成 Java 包的环境。
在 Web 服务器上安装 MATLAB Runtime。有关详细信息,请参阅下载并安装 MATLAB Runtime。
确保您的 Web 服务器能够运行公认的 Java 框架(例如 J2EE)。
将
javabuilder.jar库 () 安装到 Web 服务器的通用库文件夹中。matlabroot/toolbox/javabuilder/jar/javabuilder.jar如果您的实现有单独的客户端计算机,那么它们也需要
javabuilder.jar,因为它包含com.mathworks.extern.java包。
注意
您不需要在客户端安装 MATLAB Runtime。可以使用 boolean marshalOutputs 类中的 RemoteProxy 自动转换 MATLAB Runtime 的返回值。有关详细信息,请参阅 中的 Java API 文档。matlabroot/help/toolbox/javabuilder/MWArrayAPI
过程
将 NativeCellStruct 文件夹从 MATLAB 复制到您的工作文件夹:
copyfile(fullfile(matlabroot,'toolbox','javabuilder','Examples','RMIExamples','NativeCellStruct'))
在 MATLAB 命令提示符下,导航到工作文件夹中的新 NativeCellStruct\NativeCellStructDemoComp 子文件夹。
检查 MATLAB 函数 createEmptyStruct.m 和 updateField.m。
通过在 Java 命令提示符下发出以下命令,使用 compiler.build.javaPackage 生成 MATLAB 包:
compiler.build.javaPackage({'createEmptyStruct.m','updateField.m'}, ...
'PackageName','nativeCellStructComp', ...
'ClassName','nativeCellStructClass', ...
'Verbose','on');有关详细信息,请参阅生成 Java 包并编译 Java 应用程序中的说明。
在系统命令提示符下,导航到 NativeCellStruct\NativeCellStructDemoJavaApp 文件夹。
通过在系统命令提示符下发出以下 javac 命令之一来编译服务器 Java 代码。
在 Windows® 上,键入:
javac -classpath "matlabroot\toolbox\javabuilder\jar\javabuilder.jar;path\to\nativeCellStructComp.jar" NativeCellStructServer.java在 UNIX® 上,键入:
javac -classpath "matlabroot/toolbox/javabuilder/jar/javabuilder.jar:path/to/nativeCellStructComp.jar" NativeCellStructServer.java
注意
将 替换为 MATLAB 或 MATLAB Runtime 安装文件夹的路径。matlabroot
通过在系统命令提示符下发出以下 javac 命令之一来编译客户端 Java 代码。
在 Windows 上,键入:
javac -classpath "matlabroot\toolbox\javabuilder\jar\javabuilder.jar;path\to\dataTypesComp.jar NativeCellStructClient.java在 UNIX 上,键入:
javac -classpath "matlabroot/toolbox/javabuilder/jar/javabuilder.jar:path/to/dataTypesComp.jar" NativeCellStructClient.java
通过打开两个命令行窗口(一个用于客户端,一个用于服务器)来准备运行服务器和客户端应用程序。
通过在系统命令提示符下以一行形式发出以下 java 命令之一来运行服务器。
在 Windows 上,键入:
java -classpath .;"path\to\dataTypesComp.jar;matlabroot\toolbox\javabuilder\jar\javabuilder.jar" -Djava.rmi.server.codebase="file:///matlabroot\toolbox\javabuilder\jar\javabuilder.jar file:///path\to\dataTypesComp.jar" NativeCellStructServer在 UNIX 上,键入:
java -classpath .:"path/to/dataTypesComp.jar;matlabroot/toolbox/javabuilder/jar/javabuilder.jar" -Djava.rmi.server.codebase="file:///matlabroot/toolbox/javabuilder/jar/javabuilder.jar file:///path/to/dataTypesComp.jar" NativeCellStructServer
在第二个命令行窗口中,通过在一行中发出以下 java 命令之一来运行客户端。
在 Windows 上,键入:
java -classpath .;"path/to/\dataTypesComp.jar;matlabroot\toolbox\javabuilder\jar\javabuilder.jar" NativeCellStructClient在 UNIX 上,键入:
java -classpath .:"path/to/dataTypesComp.jar;matlabroot/toolbox/javabuilder/jar/javabuilder.jar" -Djava.rmi.server.codebase="file:///matlabroot/toolbox/javabuilder/jar/javabuilder.jar file:///path/to/dataTypesComp.jar" NativeCellStructClient
如果命令执行成功,则运行服务器的命令行窗口中会出现以下输出:
Please wait for the server registration notification.
Server registered and running successfully!!
EVENT 1: Initializing the structure on server and
sending it to client:
Initialized empty structure:
Name: ' '
Address: []
##################################
EVENT 3: Partially initialized structure as received
by server:
Name: ' '
Address: [1x1 struct]
Address field as initialized from the client:
Street: '3, Apple Hill Drive'
City: 'Natick'
State: 'MA'
Zip: '01760'
##################################
EVENT 4: Updating 'Name' field before sending the
structure back to the client
Name: 'The MathWorks'
Address: [1x1 struct]
##################################
运行客户端的命令行窗口中会出现以下输出:
Running the client application!!
EVENT 2: Initialized structure as received in client
applications:
1x1 struct array with fields:
Name
Address
Updating the 'Address' field to :
1x1 struct array with fields:
Street
City
State
Zip
#################################
EVENT 5: Final structure as received by client:
1x1 struct array with fields:
Name
Address
Address field:
1x1 struct array with fields:
Street
City
State
Zip
#################################
