C++ и Java: совместное использование - Использование INVOCATION API

ОГЛАВЛЕНИЕ

 

Использование INVOCATION API

Использование INVOCATION API позволяет встраивать JVM в приложения без необходимости их статического связывания с кодом самой JVM. Напомним, что в этом случае управление изначально находится в С/С++-программе. INVOCATION API состоит из небольшого набора функций, позволяющих создавать и уничтожать JVM в текущем процессе, присоединять и отсоединять текущий поток от JVM (интерфейсный указатель существует только в рамках данного потока).

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

Рассмотрим пример С++-кода, который создает JVM в процессе своей работы и вызывает статический метод JAVA-класса. Ниже приведены исходные тексты JAVA-класса и C++-кода:

// Файл  INVOCATIONAP.JAVAI
PUBLIC CLASS INVOCATIONAPI {
STATIC VOID TEST() {
SYSTEM.OUT.PRINTLN("HELLO FROM JAVA CODE");
}
}
// Файл INVOCATIONAPI.CPP
#INCLUDE <JNI.H>
VOID MAIN() {
JAVAVM* JVM;
JNIENV* ENV;
// инициализация
JDK1_1INITARGS VMARGS;
JNI_GETDEFAULTJAVAVMINITARGS(&VMARGS);
VMARGS.CLASSPATH = "C:/JDK1.1/LIB/CLASSES.ZIP;C:/TEST/NATIVE";
// создание JVM
JNI_CREATEJAVAVM(&JVM, &ENV, &VMARGS);
// получение ссылки на класс INVOCATIONAPI
JCLASS CLS = ENV->FINDCLASS("INVOCATIONAPI");
// вызов статического метода TEST
JMETHODID MID = ENV->GETSTATICMETHODID(CLS, "TEST", "()V");
ENV->CALLSTATICVOIDMETHOD(CLS, MID);
// удаление JVM
JVM->DESTROYJAVAVM();

Для компиляции приведенной программы на платформе WIN32 необходимо выполнить следующие команды (предполагается, что переменные окружения PATH, LIB, INCLUDE и CLASSPATH установлены верно и исходные файлы находятся в каталоге C:\TEST\NATIVE):

C:\TEST\NATIVE\ JAVAC INVOCATIONAPI.JAVA
C:\TEST\NATIVE\ CL -W3 -NOLOGO INVOCATIONAPI.CPP -FEINVOCATIONAPI -TP -MD -LINK
-NOLOGO JAVAI.LIB

А для запуска программы:

C:\TEST\NATIVE\ INVOCATIONAPI
HELLO FROM JAVA CODE
C:\TEST\NATIVE\

На первый взгляд, наличие JNI и полная публикация его спецификаций может привлечь разработчиков к написанию непереносимого JAVA-кода, что, в свою очередь, может значительно снизить эффективность применения технологии JAVA. Однако на самом деле JNI способствует обратному процессу.

Практически для любого приложения можно совершенно точно определить необходимость в многоплатформенном исполнении. Для систем, которые не нуждаются в многоплатформенности, JNI предоставляет инфраструктуру, с помощью которой JAVA-приложение может взаимодействовать с операционной системой и аппаратурой, в среде которых оно исполняется. Таким образом, JNI является естественным дополнением JAVA-технологии. Он позволяет использовать ее как для создания переносимых (клиентских) приложений, так и для создания высокопроизводительных (серверных) систем, использующих всю специфику конкретной платформы и аппаратуры, сохраняя в то же время главное достоинство JAVA - современный объектно-ориентированный подход.