Страница 9 из 9 Использование 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 - современный объектно-ориентированный подход. |