Интеграция Java EE-приложений и С-приложений на WebSphere Application Server

Java™ Native Interface (JNI) – это инфраструктура программирования, позволяющая Java-коду, выполняющемуся в виртуальной Java-машине (JVM), вызывать (и вызываться) платформенно-ориентированные приложения и библиотеки, написанные на других языках программирования, таких как C, C++ и ассемблер. В статье описывается использование этой инфраструктуры разработчиками для интеграции их J2EE™-приложений, развернутых на сервере IBM® WebSphere® Application Server, с библиотеками С. Cтатья основана на материале, опубликованном в IBM WebSphere Developer Technical Journal. Из журнала IBM WebSphere Developer Technical Journal.

Шарад Чандра, старший консультант по WebSphere, IBM

Шарад Чандра (Sharad Chandra) – фотографияШарад Чандра (Sharad Chandra) работает старшим консультантом по WebSphere в IBM Software Group. Имеет 8-летний опыт в области BPM- и SOA-технологий, а также в разработке сложных решений для заказчиков с использованием BPM-технологий и ПО промежуточного уровня.



18.06.2012

Введение

IBM® WebSphere® Application Server – это совместимая с Java® EE 6 надежная среда промежуточного ПО высокой готовности, предоставляющая платформу для размещения разнообразных корпоративных приложений и управления ими. Некоторые пользователи могут столкнуться с необходимостью интегрировать свои Java-приложения с платформенно-ориентированными программами, написанными на C/C++. Например, научные приложения в области обороны, аэрокосмических исследований, прогнозирования погоды и т.д. содержат определенные алгоритмы, которые можно реализовать только с помощью этих "родных" (нативных) языков, поскольку эти алгоритмы либо слишком сложны, либо слишком трудны, либо слишком рискованны для реализации на Java.

Чтобы интегрировать такие С-программы с Java-программами, необходимо создать нечто вроде моста между программными интерфейсами двух этих языков. Интерфейс Java Native Interface (JNI) предоставляет подобный мост для обмена данными между программными интерфейсами Java и C/C++. Чтобы реализовать это решение, необходимо определить в Java интерфейс с методами, которые будут открыты другим Java-классам, сгенерировать заголовочный файл из скомпилированного кода этого интерфейса, а затем импортировать заголовочный файл в модули динамических нативных библиотек, таких как библиотеки с динамическим связыванием (.dll) для Windows® и Shared Object (.so) для UNIX®-систем. Эти модули можно создавать при помощи различных инструментальных средств, предоставляемых рядом производителей.

В статье описаны шаги, позволяющие посредством интерфейса Java Native Interfaces (JNI) легко интегрировать с C-программами Java-приложения, развернутые на сервере WebSphere Application Server. В результате вы сможете создавать, конфигурировать и вызывать динамические библиотеки для WebSphere Application Server.

Приведенная информация относится к IBM WebSphere Application Server версий V6.1, V7 и V8 и предполагает знакомство с соответствующим инструментарием IBM Rational®. Обратите внимание, что представленные примеры предназначены только для иллюстрации общей процедуры разработки и не затрагивают проверку данных и другие передовые методики, которые обычно реализуются при разработке приложений.


Создание динамических native-библиотек

  1. Откройте IBM Integration Designer и создайте отдельный Java-проект (рисунок 1).
    Рисунок 1. Создание отдельного проекта
    Рисунок 1. Создание отдельного проекта
  2. Создайте Java-класс с методами, которые хотите ассоциировать с нативными методами (рисунок 2). Объявления методов будут зависеть от сигнатуры вызываемых С-методов. В нашем случае стороннему программному интерфейсу C необходимы простой тип и массив данных (конкретно массив double). Чтобы вызвать другую нативную библиотеку, необходимо ассоциировать ее с вашей DLL путем импорта заголовочного файла во время реализации заголовка.
    Рисунок 2. Создание Java-класса
    Рисунок 2. Создание Java-класса
  3. Скомпилируйте Java-интерфейс и выполните команду javah с файлом .class, сгенерированным из скомпилированного кода в каталоге {APPSERVER_ROOT}/Java/bin, чтобы создать соответствующие заголовочные файлы C (рисунок 3).

    <APPSERVER_ROOT>java\bin>javah -o header_file_name.h <JAVA_CLASS_NAME>

    Рисунок 3. Создание заголовочных файлов C
    Рисунок 3. Создание заголовочных файлов C
  4. Теперь необходимо создать динамическую native-библиотеку, используя методы, сгенерированные в заголовочном файле. Созданную библиотеку можно интегрировать с другими С-библиотеками во время вызовов С-интерфейсов другими С-интерфейсами (рисунок 4).
    Рисунок 4. Код заголовочного файла Java
    Рисунок 4. Код заголовочного файла Java
  5. Чтобы сгенерировать библиотеку .dll или .so, код заголовка, показанный на рисунке 4, необходимо скопировать в проект динамической библиотеки. Для создания динамических библиотек можно использовать любой C/C++-редактор. Проект DLL содержит разделы заголовка (.h-файл, рисунок 5) и реализации (.c-файл, рисунок 6), отделенные от других разделов в зависимости от используемого редактора.
    Рисунок 5. Копирование кода заголовочного файла Java в раздел заголовка проекта dll
    Рисунок 5. Копирование кода заголовочного файла Java в раздел заголовка проекта dll
    Рисунок 6. Реализация методов заголовка Java в разделе Implementation
    Рисунок 6. Реализация методов заголовка Java в разделе Implementation
  6. Обратите внимание, что файл jni.h находится во включаемом каталоге среды исполнения Java на WebSphere Application Server по адресу {APPSERVER_ROOT}/Java/include (рисунок 7).
    Рисунок 7. Местоположение файла jni.h в WebSphere
    Рисунок 7. Местоположение файла jni.h в WebSphere

Поскольку при компиляции кода заголовка Java в модуле DLL выполняется обращение к файлу jni.h, можно скопировать этот файл из каталога {APPSERVER_ROOT}/java/include в местоположение C-редактора и поместить его в путь подключения (include path), что гарантирует успешную компиляцию DLL. После создания DLL можно скопировать этот файл в соответствующее место на WebSphere Application Server.


Конфигурирование нативных библиотек на WebSphere Application Server

Для конфигурирования DLL при помощи WebSphere Application Server скопируйте DLL в папку, созданную в каталоге {APPSERVER_ROOT} (рисунок 8), и настройте его путь в пользовательских свойствах виртуальной машины, выбрав Server > ServerTypes > WebSphere Application Server > server1 > Java and Process Management > Process Definition > Java Virtual Machine > Custom Properties (рисунок 9).

Рисунок 8. Новая папка для DLL в корневом каталоге
Рисунок 8. Новая папка для DLL в корневом каталоге
Рисунок 9. Пользовательские свойства JVM
Рисунок 9. Пользовательские свойства JVM

Если не установить на WebSphere Application Server данное свойство виртуальной машины, при попытке загрузчика класса загрузить DLL возникнет исключительная ситуация (рисунок 10).

Рисунок 10. Исключительная ситуация загрузчика класса
Рисунок 10. Исключительная ситуация загрузчика класса

После установки пути DLL в свойстве виртуальной машины на WebSphere Application Server сервер необходимо перезапустить.


Java EE-решение для вызова нативной библиотеки при помощи WebSphere Application Server

Чтобы продемонстрировать вызов методов, определенных в DLL, будет использоваться сервлет, развернутый на WebSphere Application Server из EAR-файла. Перед вызовом нативных методов из любого Java-класса, автономного или входящего в состав EAR-файла, необходимо загрузить его путем вызова System.loadlibrary в блоке static. Таким образом, DLL загружается на начальных этапах загрузки класса (рисунок 11).

Рисунок 11. Загрузка класса
Рисунок 11. Загрузка класса

Для вызова нативных методов из Java-классов необходим нативный класс, который служит для создания заголовочного файла в classpath. В нашем примере этот класс помещается в виде JAR-файла в каталог WEB-INF/lib, чтобы сервлет мог использовать его во время исполнения (рисунок 12).

Рисунок 12. Вызов JNI-кода из Java-класса
Рисунок 12. Вызов JNI-кода из Java-класса

После развертывания EAR-файла необходимо перезапустить сервер, так как сервлет загружается во время запуска, при котором, в свою очередь, загружается DLL. Поскольку нативные библиотеки загружаются в собственную память WebSphere Application Server, необходим перезапуск сервера; в противном случае возникнет исключительная ситуация, сообщающая, что библиотека уже загружена другим загрузчиком класса во время вызова сервлета.


Тестирование решения

Мы рассмотрим два теста: передачу простого типа данных в нативный метод и использование массива.

  • Тестирование простой операции сложения

    В этом тесте мы введем целочисленные значения в поля данных и получим результат их сложения.

    Рисунок 13. Ввод данных для тестирования операции сложения
    Рисунок 13. Ввод данных для тестирования операции сложения
    Рисунок 14. Результат тестирования операции сложения
    Рисунок 14. Результат тестирования операции сложения
  • Тестирование данных массива

    В этом тесте мы заполним массив десятью значениями на JSP-странице, которая в свою очередь вызовет нативный метод через сервлет, отображающий удвоенное значение каждого поля в массиве.

    Рисунок 15. Ввод данных для тестирования массива с удвоенными значениями
    Рисунок 15. Ввод данных для тестирования массива с удвоенными значениями
    Рисунок 16. Результаты тестирования массива с удвоенными значениями
    Рисунок 16. Результаты тестирования массива с удвоенными значениями

Заключение

В этой статье были рассмотрены простые примеры, демонстрирующие способы интеграции Java-кода, выполняющегося на WebSphere Application Server, с C-кодом путем использования программного интерфейса C через JNI (Java Native Interface) для создания моста между ними посредством динамической библиотеки (DLL).


Загрузка

ОписаниеИмяРазмер
Пример кода1203_chandra_ProjectData.zip16 КБ

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=WebSphere, Технология Java
ArticleID=821455
ArticleTitle=Интеграция Java EE-приложений и С-приложений на WebSphere Application Server
publish-date=06182012