Ограничения на несколько пакетов в одном приложении Java

При разработке Java® приложения, которые используют несколько MATLAB® пакеты, полагайте, что следующие типы данных не могут быть совместно использованы пакетами:

  • Указатели функции MATLAB

  • Указатели фигуры MATLAB

  • Объекты MATLAB

  • C, Java и объекты.NET

  • Исполняемые данные хранимы в массивах ячеек и структурах

Чтобы работать вокруг этих ограничений, можно объединить несколько пакетов Java в один пакет.

Объединение пакетов с указателями функции MATLAB

Указатели функции MATLAB могут быть переданы между приложением и экземпляром MATLAB Runtime, из которого оно произошло. Однако указатель функции 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

Если вы компилируете их в два пакета, вызов 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.

Похожие темы