单个 Java 应用程序中多个包的限制
在开发使用多个 Java® 包的 MATLAB® 应用程序时,请考虑以下类型的数据不能在包之间共享:
MATLAB 函数句柄
MATLAB 图窗句柄
MATLAB 对象
C、Java 和 .NET 对象
存储在元胞数组和结构中的可执行数据
为了解决这些限制,您可以将多个 Java 包合并为一个包。
将包与 MATLAB 函数句柄结合起来
您可以在应用程序和其起源的 MATLAB Runtime 实例之间传递 MATLAB 函数句柄。但是,MATLAB 函数句柄不能传递到其起源实例之外的 MATLAB Runtime 实例中。例如,假设您有两个 MATLAB 函数,get_plot_handle 和 plot_xy,并且 plot_xy 使用由 get_plot_handle 创建的函数句柄。
% Saved as get_plot_handle.m function h = get_plot_handle(lnSpec, lnWidth, mkEdge, mkFace, mkSize) h = @draw_plot; function draw_plot(x, y) plot(x, y, lnSpec, ... 'LineWidth', lnWidth, ... 'MarkerEdgeColor', mkEdge, ... 'MarkerFaceColor', mkFace, ... 'MarkerSize', mkSize) end end
% Saved as plot_xy.m function plot_xy(x, y, h) h(x, y); end
如果将它们编译成两个 Java 包,对 plot_xy 调用将会引发异常。
import com.mathworks.toolbox.javabuilder.*;
import get_plot_handle.*;
import plot_xy.*;
class plottter
{
public static void main(String[] args)
{
MWArray h = null;
try
{
plotter_handle = new get_plot_handle.Class1();
plot = new plot_xy.Class1();
h = plotter_handle.get_plot_handle(1,'--rs',2.0,'k','g',10);
double[] x = {1,2,3,4,5,6,7,8,9};
double[] y = {2,6,12,20,30,42,56,72,90};
plot.plot_xy(x, y, h);
}
catch (Exception e)
{
System.out.println("Exception: " + e.toString());
}
finally
{
MWArray.disposeArray(h);
plot.dispose();
plotter_handle.dispose();
}
}
}纠正这种情况的方法是将两个函数编译成一个包。
import com.mathworks.toolbox.javabuilder.*;
import plot_functions.*;
class plotter
{
public static void main(String[] args)
{
MWArray h = null;
try
{
plot_funcs = new Class1();
h = plot_funcs.get_plot_handle(1, '--rs', 2.0, 'k', 'g', 10);
double[] x = {1,2,3,4,5,6,7,8,9};
double[] y = {2,6,12,20,30,42,56,72,90};
plot_funcs.plot_xy(x, y, h);
}
catch (Exception e)
{
System.out.println("Exception: " + e.toString());
}
finally
{
MWArray.disposeArray(h);
plot_funcs.dispose();
}
}
}您还可以使用单例 MATLAB Runtime 来纠正这种情况。有关详细信息,请参阅共享 MATLAB Runtime 实例。
将包与对象组合
MATLAB Compiler SDK™ 使您能够将以下类型的对象从 MATLAB Runtime 返回到您的应用程序代码:
MATLAB
C++
.NET
Java
但是,您不能将在一个 MATLAB Runtime 实例中创建的对象传递到另一个 MATLAB Runtime 实例中。当返回对象的函数和操作该对象的函数被编译到不同的包中时,就会发生这种冲突。
例如您开发了两个函数。第一个是根据一些条件为客户创建一个银行账户。第二种是在两个账户之间转移资金。
% Saved as account.m classdef account < handle properties name end properties (SetAccess = protected) balance = 0 number end methods function obj = account(name) obj.name = name; obj.number = round(rand * 1000); end function deposit(obj, deposit) new_bal = obj.balance + deposit; obj.balance = new_bal; end function withdraw(obj, withdrawl) new_bal = obj.balance - withdrawl; obj.balance = new_bal; end end end
% Saved as open_acct .m function acct = open_acct(name, open_bal ) acct = account(name); if open_bal > 0 acct.deposit(open_bal); end end
% Saved as transfer.m function transfer(source, dest, amount) if (source.balance > amount) dest.deposit(amount); source.withdraw(amount); end end
如果您将 open_acct.m 和 transfer.m 编译到单独的包中,则无法使用通过 open_acct 创建的账户转移资金。transfer 调用引发异常。解决此冲突的一种方法是将两个函数编译成一个包。您还可以重构应用程序,以便不将 MATLAB 对象传递给函数。您还可以使用单例 MATLAB Runtime。有关详细信息,请参阅共享 MATLAB Runtime 实例。