主要内容

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

单个 Java 应用程序中多个包的限制

在开发使用多个 Java® 包的 MATLAB® 应用程序时,请考虑以下类型的数据不能在包之间共享:

  • MATLAB 函数句柄

  • MATLAB 图窗句柄

  • MATLAB 对象

  • C、Java 和 .NET 对象

  • 存储在元胞数组和结构中的可执行数据

为了解决这些限制,您可以将多个 Java 包合并为一个包。

将包与 MATLAB 函数句柄结合起来

您可以在应用程序和其起源的 MATLAB Runtime 实例之间传递 MATLAB 函数句柄。但是,MATLAB 函数句柄不能传递到其起源实例之外的 MATLAB Runtime 实例中。例如,假设您有两个 MATLAB 函数,get_plot_handleplot_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.mtransfer.m 编译到单独的包中,则无法使用通过 open_acct 创建的账户转移资金。transfer 调用引发异常。解决此冲突的一种方法是将两个函数编译成一个包。您还可以重构应用程序,以便不将 MATLAB 对象传递给函数。您还可以使用单例 MATLAB Runtime。有关详细信息,请参阅共享 MATLAB Runtime 实例

另请参阅

主题