Как работы интегрирования MATLAB Compiler SDK Java

Когда вы создаете Java® пакеты с помощью MATLAB® Compiler SDK™, компилятор шифрует ваши функции MATLAB и генерирует один или несколько классов Java, которые переносят ваши функции MATLAB. Классы предоставляют методы, которые позволяют вам вызывать функции, когда вы были бы любой другой метод Java.

Кроме того, javabuilder пакет, которому предоставляют MATLAB и MATLAB Runtime, содержит MWArray классы, которые управляют данными, которые передают между Java и MATLAB.

MWArray Классы преобразования данных

При записи приложения Java можно представлять объекты использования данных любого MWArray классы преобразования данных. В качестве альтернативы можно использовать стандартные типы данных Java и объекты.

MWArray классы преобразования данных создаются как иерархия классов, которая представляет главные типы массива MATLAB.

MWArray Иерархия

Корнем иерархии классов преобразования данных является MWArray абстрактный класс. MWArray класс имеет следующие подклассы, представляющие главные типы MATLAB: MWNumericArray, MWLogicalArray, MWCharArray, MWCellArray, и MWStructArray. Каждый подкласс хранит ссылку на нативный массив MATLAB того типа.

MWArray классы обеспечивают следующее:

  • Конструкторы и финализаторы, чтобы инстанцировать и избавиться от массивов MATLAB

  • get и set методы, чтобы читать и записать данные массива

  • Методы, чтобы идентифицировать свойства массива

  • Методы сравнения протестировать равенство или порядок массива

  • Методы преобразования, чтобы преобразовать в другие типы данных

Примечание

Для полной справочной информации о MWArray иерархия классов, смотрите com.mathworks.toolbox.javabuilder.MWArray, который находится в matlabroot/help/toolbox/javabuilder/MWArrayAPI/ папка.

Автоматическое и ручное преобразование в типы MATLAB

Если ваш код Java использует нативный примитивный Java или массив как входной параметр, компилятор автоматически преобразует его в экземпляр соответствующего MWArray класс, прежде чем это будет передано методу. Компилятор может преобразовать любую строку Java, числовой тип или многомерный массив этих типов к соответствующему MWArray ввод.

В отличие от этого можно вручную преобразовать типы данных Java в один из стандартных типов данных MATLAB с помощью MWArray классы преобразования данных. Когда вы передаете MWArray экземпляр как входной параметр, инкапсулированный массив MATLAB передается непосредственно названному методу. Для получения дополнительной информации и примеры, смотрите, Преобразуют Данные Между Java и MATLAB.

Для списка всех типов данных, которые поддерживаются наряду с их эквивалентными типами в MATLAB, см. Правила для Преобразования Данных Между Java и MATLAB.

Преимущество Использования классов преобразования данных

MWArray классы преобразования данных позволяют вам передать нативные параметры типа непосредственно, не используя явное преобразование данных. Если вы часто передаете тот же массив, вы можете улучшать производительность своей программы путем хранения массива в экземпляре одного из MWArray подклассы.

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

Функциональные подписи, сгенерированные MATLAB Compiler SDK

Язык программирования Java поддерживает дополнительные аргументы функции в способе, которым MATLAB делает с varargin и varargout. Чтобы поддерживать эту функцию MATLAB, компилятор генерирует один перегруженный метод Java, который вмещает любое количество входных параметров.

Подписи функции MATLAB

Типовая функция MATLAB имеет следующую структуру:

function [Out1, Out2, ..., varargout]=
           foo(In1, In2, ..., varargin)

Слева от знака "равно" функция задает набор явных и дополнительных возвращаемых аргументов.

Справа от знака "равно" функция перечисляет явные входные параметры, сопровождаемые одним или несколькими дополнительными аргументами.

Каждый аргумент представляет тип MATLAB. Когда вы включаете varargin или varargout аргумент, можно задать любое количество вводов или выводов вне тех, которые явным образом объявляются.

Перегруженные методы на Java, которые инкапсулируют код MATLAB

Когда MATLAB Compiler SDK инкапсулирует ваш код MATLAB, он создает перегруженный метод, который реализует функции MATLAB. Этот перегруженный метод соответствует вызову типовой функции MATLAB для каждой комбинации возможного номера и типа входных параметров.

В дополнение к инкапсуляции входных параметров компилятор создает другой метод, который представляет выходные аргументы функции MATLAB. Этот метод инкапсуляции информации о возвращаемых значениях напоминает mlx интерфейс сгенерирован для цели MATLAB Compiler SDK C/C++.

Эти перегруженные методы называются стандартным интерфейсом и mlx интерфейс. Для получения дополнительной информации смотрите Интерфейсы программирования, Сгенерированные MATLAB Compiler SDK.

Примечание

При добавлении полей в структуры данных и массивы структуры данных, сделайте настолько использующие стандартные методы программирования. Не используйте set команда как ярлык.

Взаимодействие между MATLAB Compiler SDK и JVM

Пакеты, произведенные MATLAB Compiler SDK, используют Собственный интерфейс Java (JNI), чтобы взаимодействовать с MATLAB Runtime.

Когда первый объект MATLAB Compiler SDK инстанцируют:

  1. Загружаются зависимые классы MATLAB Compiler SDK.

  2. Серия разделяемых библиотек, формирующих мост JNI от сгенерированного пакета до MATLAB Runtime, загружается.

  3. MATLAB Runtime инициализируется путем создания экземпляра класса C++ под названием mcrInstance.

  4. Интерфейс MATLAB-Java устанавливает связь с JVM™ путем вызова метода JNI AttachCurrentThread.

  5. AttachCurrentThread создает загрузчик класса, который загружает все классы, необходимые коду MATLAB, использующему интерфейс MATLAB-Java.

  6. Ядро C++ MATLAB Runtime выделяет ресурсы для массивов, созданных API Java.

Когда вы создаете MWArray объекты взаимодействовать с MATLAB Runtime, JVM создает интерфейсный объект для mxArray MATLAB объект. Ядро C++ MATLAB Runtime выделяет фактические ресурсы, чтобы сохранить mxArray объект. Это оказывает влияние на то, как JVM освобождает ресурсы, используемые вашим приложением. Большинство ресурсов, используемых при взаимодействии с MATLAB, создается ядром C++ MATLAB Runtime. JVM только знает о ресурсах MATLAB через обертки JNI, созданные для них. Из-за этого JVM не знает размера используемых ресурсов и не может эффективно управлять ими использующий его созданный в сборщике "мусора". JVM также не управляет потоками, используемыми MATLAB Runtime, и не может очистить их.

Все классы MATLAB Compiler SDK имеют статические методы правильно избавиться от их ресурсов. Методы распоряжения инициировали освобождение от базовых ресурсов в ядре C++ MATLAB Runtime. Не правильно избавление от объектов MATLAB Compiler SDK может привести к непредсказуемому поведению и может быть похожим на ваше приложение, имеет утечку памяти.