Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 10 лет назад пользователемДанила Скобелев
1 Java Native Interface (JNI)
2 Что такое JNI ? Java Native Interface (JNI) стандартный механизм Java, с помощью которого Java-код может взаимодействовать с системным или прикладным собственным кодом (вызывать его и вызываться им), написанным на языках подобных С, C++ или ассемблера, скомпилированным и работающим непосредственно под управлением той или иной операционной системы. Java Native Interface (JNI) стандартный механизм Java, с помощью которого Java-код может взаимодействовать с системным или прикладным собственным кодом (вызывать его и вызываться им), написанным на языках подобных С, C++ или ассемблера, скомпилированным и работающим непосредственно под управлением той или иной операционной системы.
3 Что такое JNI ? Взаимодействие Java с другими языками
4 Взаимодействие кодов JAVA и С/С++ может осуществляться двумя способами С/С++ - код получает управление непосредственно из JAVA-программы путем вызова собственного (NATIVE) метода С/С++ - код получает управление непосредственно из JAVA-программы путем вызова собственного (NATIVE) метода С/С++ - код динамически загружает JVM с помощью INVOCATION API С/С++ - код динамически загружает JVM с помощью INVOCATION API
5 JNI – NATIVE метод Необходимо создать собственный JAVA-метод Необходимо создать собственный JAVA-метод Сгенерировать с помощью утилиты JAVAH заголовочный файл для С/С++ - функций Сгенерировать с помощью утилиты JAVAH заголовочный файл для С/С++ - функций Разработать сами функции, в которые будет передаваться управление Разработать сами функции, в которые будет передаваться управление Оттранслировать функции поместив в библиотечный файл Оттранслировать функции поместив в библиотечный файл После создания библиотеки ее можно загружать из JAVA- программы для последующего вызова собственных методов. После создания библиотеки ее можно загружать из JAVA- программы для последующего вызова собственных методов.
6 JNI – INVOCATION API метод Использование INVOCATION API позволяет встраивать JVM в приложения (без необходимости их статического связывания с кодом самой JVM) Использование INVOCATION API позволяет встраивать JVM в приложения (без необходимости их статического связывания с кодом самой JVM) управление изначально находится в С/С++ - программе. управление изначально находится в С/С++ - программе. INVOCATION API состоит из небольшого набора функций, позволяющих создавать и уничтожать JVM в текущем процессе INVOCATION API состоит из небольшого набора функций, позволяющих создавать и уничтожать JVM в текущем процессе присоединять и отсоединять текущий поток от JVM присоединять и отсоединять текущий поток от JVM
7 Используя JNI, собственные методы могут Создавать, проверять и обновлять Java объекты (включая массивы и типы String) Создавать, проверять и обновлять Java объекты (включая массивы и типы String) Вызывать Java методы Вызывать Java методы Ловить и выбрасывать исключения Ловить и выбрасывать исключения Загружать классы и получать информацию о классах Загружать классы и получать информацию о классах Выполнять проверку типов во время исполнения Выполнять проверку типов во время исполнения
8 JNI определяет ~210 прикладных функций Доступ к JNI-функциям из С/С++ -функции можно получить через интерфейсный указатель JNIENV* Доступ к JNI-функциям из С/С++ -функции можно получить через интерфейсный указатель JNIENV* Указатель JNIENV* передается каждой С/С++ - функции, представляющей реализацию собственного метода Указатель JNIENV* передается каждой С/С++ - функции, представляющей реализацию собственного метода
9 Все ~210 функции разделены на ~14 групп информация о версии JNI информация о версии JNI операции с классами операции с классами исключения (EXCEPTIONS) исключения (EXCEPTIONS) обработка глобальных и локальных ссылок обработка глобальных и локальных ссылок операции с объектами операции с объектами доступ к данным объекта доступ к данным объекта вызов методов объекта (INSTANCE METHOD) вызов методов объекта (INSTANCE METHOD) доступ к статическим данным объекта доступ к статическим данным объекта вызов методов класса (CLASS METHOD) вызов методов класса (CLASS METHOD) операции со строковыми объектами операции со строковыми объектами операции с массивами операции с массивами регистрация собственных методов регистрация собственных методов операции с мониторами (MONITOR OPERATIONS) операции с мониторами (MONITOR OPERATIONS) интерфейс с JVM интерфейс с JVM
10 JNI и исключения в Java Throw ( ) Выбрасывает существующий объект исключения. Используется в собственном объекте для повторного выбрасывания исключения. Throw ( ) Выбрасывает существующий объект исключения. Используется в собственном объекте для повторного выбрасывания исключения. ThrowNew( ) Создает новый объект исключения и выбрасывает его. ThrowNew( ) Создает новый объект исключения и выбрасывает его. ExceptionOccurred( ) Определяет, было ли исключение уже выброшено, но еще не очищено. ExceptionOccurred( ) Определяет, было ли исключение уже выброшено, но еще не очищено. ExceptionDescribe( ) Печатает исключение и содержимое стека. ExceptionDescribe( ) Печатает исключение и содержимое стека. ExceptionClear ( ) Очищает рассматриваемое исключение. ExceptionClear ( ) Очищает рассматриваемое исключение. FatalError( ) Вызывает фатальную ошибку. Возврата нет. FatalError( ) Вызывает фатальную ошибку. Возврата нет.
11 Основные этапы реализации native метода используя JNI 1. Создание класса который объявляет native метод. 2. Компиляция программы 3. Используя javah –jni создать заголовочный файл C/С++ (.h) Написание реализации выполнения native метода, (.с) Компиляция С кода в dll или so библиотеку Запуск Java приложения используя полученную библиотеку
12 Создание собственного JAVA-метода Собственный метод создается путем добавления к его описанию спецификатора NATIVE, при этом он не должен иметь реализации (так же как и методы в описании интерфейса). Собственный метод создается путем добавления к его описанию спецификатора NATIVE, при этом он не должен иметь реализации (так же как и методы в описании интерфейса). Спецификатор NATIVE сообщает компилятору, что реализация данного метода будет представлена в виде откомпилированного С/С++ - кода, помещенного в библиотечный файл. Спецификатор NATIVE сообщает компилятору, что реализация данного метода будет представлена в виде откомпилированного С/С++ - кода, помещенного в библиотечный файл. Когда JVM встречает обращение к собственному методу, происходит вызов соответствующей С/С++ - функции. Когда JVM встречает обращение к собственному методу, происходит вызов соответствующей С/С++ - функции. Помимо описания собственного метода, JAVA-код должен динамически загрузить библиотеку, содержащую С/С++ - функцию с реализацией данного метода. Помимо описания собственного метода, JAVA-код должен динамически загрузить библиотеку, содержащую С/С++ - функцию с реализацией данного метода.
13 Создание класса который объявляет native метод class HelloWorld { //native метод public native void displayHello(); //Статическая инициализация static { //динамически загрузить библиотеки System.loadLibrary("c_library"); } public static void main(String[] args) { //создание нового объекта HelloWorld hw = new HelloWorld(); // вызов метода реализованного в С/С++ hw.displayHello(); } }
14 Метод LOADLIBRARY() вызывается в статическом инициализаторе, что обеспечивает единственный вызов этого метода после загрузки класса. вызывается в статическом инициализаторе, что обеспечивает единственный вызов этого метода после загрузки класса. можно вызывать более одного раза (например, в конструкторе), загрузка библиотеки будет происходить только при первом обращении к LOADLIBRARY(), при последующих вызовах этого метода определяется, что библиотека уже загружена и будет просто возвращаться управление. можно вызывать более одного раза (например, в конструкторе), загрузка библиотеки будет происходить только при первом обращении к LOADLIBRARY(), при последующих вызовах этого метода определяется, что библиотека уже загружена и будет просто возвращаться управление. преобразует свой параметр в соответствии с тем, как именуются библиотечные файлы на конкретной платформе (dll, so) преобразует свой параметр в соответствии с тем, как именуются библиотечные файлы на конкретной платформе (dll, so) использует стандартный алгоритм поиска библиотеки для данной платформы использует стандартный алгоритм поиска библиотеки для данной платформы
15 LOADLIBRARY() алгоритм поиска библиотеки для WIN32 DLL Для WIN32 DLL может находиться в текущем каталоге процессав текущем каталоге процесса в каталоге, содержащем EXE-файл (то есть исполняемый модуль JVM, находящийся в подкаталоге BIN основного каталога JAVA)в каталоге, содержащем EXE-файл (то есть исполняемый модуль JVM, находящийся в подкаталоге BIN основного каталога JAVA) в системном каталоге WIN32в системном каталоге WIN32 в каталоге WINDOWSв каталоге WINDOWS в каталогах, указанных в переменной окружения PATHв каталогах, указанных в переменной окружения PATH
16 LOADLIBRARY() алгоритм поиска библиотеки для UNIX Для UNIX библиотечный файл может находиться в текущем каталоге процессав текущем каталоге процесса в подкаталоге LIB основного каталога JAVAв подкаталоге LIB основного каталога JAVA в каталогах, перечисленных в переменной окружения LD_LIBRARY_PATHв каталогах, перечисленных в переменной окружения LD_LIBRARY_PATH
17 LOADLIBRARY() - исключительная ситуация JAVA.LANG.UNSATISFIEDLINKERROR JAVA.LANG.UNSATISFIEDLINKERROR Если указанную библиотеку найти не удается Если указанную библиотеку найти не удается Если метод не найден Если метод не найден
18 Компиляция программы Ничем не отличается от компиляции обычных программ. Ничем не отличается от компиляции обычных программ. Например, если записать пример в файл с именем APP.JAVA, то для его компиляции необходимо выполнить следующую команду: Например, если записать пример в файл с именем APP.JAVA, то для его компиляции необходимо выполнить следующую команду: C:\ JAVAC APP.JAVA
19 Создание заголовочного файла Его можно написать: В ручнуюВ ручную Воспользоваться утилитой JAVAHВоспользоваться утилитой JAVAH
20 Утилита JAVAH При обращении к утилите JAVAH указывается имя класса и параметр -JNI При обращении к утилите JAVAH указывается имя класса и параметр -JNI Утилита JAVAH анализирует CLASS-файл и строит заголовочный файл Утилита JAVAH анализирует CLASS-файл и строит заголовочный файл В качестве имен создаваемых заголовочных файлов используются полные квалифицированные имена классов, которые описаны в указанном файле и содержат собственные методы В качестве имен создаваемых заголовочных файлов используются полные квалифицированные имена классов, которые описаны в указанном файле и содержат собственные методы
21 Создание заголовочного файла используя JAVAH JAVAH -JNI JAVAH -JNI HelloWorld Выходной файл HelloWorld.h
22 Содержимое заголовочного файла #include /* Header for class Example */ #ifndef _Included_Example #define _Included_Example #ifdef __cplusplus extern "C" { #endif/* * Class: Example * Method: nativeMethod * Signature: ()V */ JNIEXPORT VOID JNICALL Java_displayHello_helloWorld (JNIEnv *, jobject); #ifdef __cplusplus }#endif#endif
23 Содержимое заголовочного файла Директива препроцессора #INCLUDE включает файл JNI.H (из подкаталога INLCUDE основного каталога JAVA), в котором находятся все необходимые объявления типов и функций для реализации собственного метода. Директива препроцессора #INCLUDE включает файл JNI.H (из подкаталога INLCUDE основного каталога JAVA), в котором находятся все необходимые объявления типов и функций для реализации собственного метода. Макросы JNIEXPORT и JNICALL необходимы только для платформы WIN32, где они раскрываются соответственно в __DECLSPEC(DLLEXPORT) и __STDCALL и позволяют более эффективно строить DLL. Платформа UNIX использует для этих целей обычные С-соглашения, поэтому указанные макросы раскрываются в пустые строки. Макросы JNIEXPORT и JNICALL необходимы только для платформы WIN32, где они раскрываются соответственно в __DECLSPEC(DLLEXPORT) и __STDCALL и позволяют более эффективно строить DLL. Платформа UNIX использует для этих целей обычные С-соглашения, поэтому указанные макросы раскрываются в пустые строки. имя С/С++ - функции значительно отличается от имени собственного JAVA-метода. При построении имени С/С++ - функции и использовании JNI-функций является сигнатура метода (SIGNATURE или METHOD ARGUMENTS SIGNATURE). имя С/С++ - функции значительно отличается от имени собственного JAVA-метода. При построении имени С/С++ - функции и использовании JNI-функций является сигнатура метода (SIGNATURE или METHOD ARGUMENTS SIGNATURE).
24 Сигнатура метода Сигнатура метода - это сокращенная форма записи параметров метода и типов возвращаемого значения. Сигнатура метода - это сокращенная форма записи параметров метода и типов возвращаемого значения. В сигнатуру не входят ни имя метода, ни имена параметров. В сигнатуру не входят ни имя метода, ни имена параметров. JNI формирует сигнатуры в соответствии с правилами JNI формирует сигнатуры в соответствии с правилами
25 METHOD ARGUMENTS SIGNATURE Знак сигнатуры JAVA-тип ZBOOLEAN BBYTE CCHAR SSHORT IINT JLONG FFLOAT VVOID DDOUBLE L полное квалифицированное имя класса полное квалифицированное имя класса [ тип тип[] (типы аргументов) возвращаемый тип полная сигнатура метода
26 SIGNATURE - примеры метод LONG M1(INT N, STRING S, INT[] ARR); метод LONG M1(INT N, STRING S, INT[] ARR); сигнатура (ILJAVA/LANG/STRING;[I)J;сигнатура (ILJAVA/LANG/STRING;[I)J; метод VOID M2(FLOAT N, BYTE[][] ARR, RUNTIME R); метод VOID M2(FLOAT N, BYTE[][] ARR, RUNTIME R); сигнатура (F[[BLJAVA/LANG/RUNTIME;)V.сигнатура (F[[BLJAVA/LANG/RUNTIME;)V. Метод void funcC() Метод void funcC() сигнатура ()V сигнатура ()V
27 Правила формирования имени С/С++ - функции Формируется путем последовательного соединения следующих компонентов: префикс JAVA_префикс JAVA_ полное квалифицированное имя класса;полное квалифицированное имя класса; символ подчеркивания ("_")символ подчеркивания ("_") имя методаимя метода для перегружаемых (OVERLOADED) методов - два символа подчеркивания ("_ _") с последующей сигнатурой метода.для перегружаемых (OVERLOADED) методов - два символа подчеркивания ("_ _") с последующей сигнатурой метода.
28 Реализации выполнения native метода #include … #include HelloWorld.h JNIEXPORT VOID JNICALL Java_displayHello_helloWorld (JNIEnv * je, jobject jo) { printf( "!!! In the native method !!!\n" ); return;}
29 Типы и структуры данных JNI Все типы описаны в файле JNI.H Все типы описаны в файле JNI.H JNI.H использует стандартную технику препроцессирования с макросом _CPLUSPLUS JNI.H использует стандартную технику препроцессирования с макросом _CPLUSPLUS В зависимости от того, какой (С++ или С) код компилируется, будут создаваться две немного отличающиеся версии описания типов. Каждая из них требует определенного синтаксиса доступа. В зависимости от того, какой (С++ или С) код компилируется, будут создаваться две немного отличающиеся версии описания типов. Каждая из них требует определенного синтаксиса доступа.
30 Доступа к функциям JNI Стиль С JNIEXPORT VOID JNICALL JAVA_SYSTEMSPECIFIC_DOSPECIFIC(JNIENV* ENV, JOBJECT THIS) { JINT VERSION = (*ENV)->GETVERSION(ENV); Е }JNIEXPORT VOID JNICALL JAVA_SYSTEMSPECIFIC_DOSPECIFIC(JNIENV* ENV, JOBJECT THIS) { JINT VERSION = (*ENV)->GETVERSION(ENV); Е } Стиль С++ JNIEXPORT VOID JNICALL JAVA_SYSTEMSPECIFIC_DOSPECIFIC(JNIENV* ENV, JOBJECT THIS) { JINT VERSION = ENV->GETVERSION(); Е }JNIEXPORT VOID JNICALL JAVA_SYSTEMSPECIFIC_DOSPECIFIC(JNIENV* ENV, JOBJECT THIS) { JINT VERSION = ENV->GETVERSION(); Е }
31 Продолжение следует…
32 Development Tool for Java-COM Bridge ( RJCB in JVI)
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.