
- •JAVA-ТЕХНОЛОГИЯ
- •Определение JNI
- •Когда используется JNI
- •Пример разработки программы, использующей JNI
- •Пример. Шаг 1. Файл HelloWorld.java
- •Пример. Шаг 1. Native-методы
- •Пример. Шаг 2. Компиляция HelloWorld.java
- •Пример. Шаг 3. javah
- •Пример. Шаг 3. javah
- •Пример. Шаг 3. HelloWorld.h
- •Пример. Шаг 4. libhello.cpp
- •Пример. Шаг 5. Компиляция libhello.cpp
- •Пример. Шаг 6. Результат
- •Комментарии
- •Более сложный пример. TypeTest.java
- •Более сложный пример. liblen.c
- •Комментарии
- •Преобразования базовых
- •Объекты
- •Дополнительные возможности native- методов
- •Проблемы и недостатки
- •Литература

JAVA-ТЕХНОЛОГИЯ
Сафонов Владимир Олегович
Профессор кафедры информатики, руководитель лаборатории Java- технологии (http://polyhimnie.math.spbu.ru/jtl)
Email: vosafonov@gmail.com
Лекция 22
Платформно-зависимые (native) методы в Java. Java Native Interface (JNI)

Определение JNI
Java Native Interface (JNI) – это механизм, позволяющий байт-коду Java вызывать native («родной») код, исполняемый под управлением конкретной операционной системы
Native-код может быть написан на различных компилируемых языках, таких как C, C++, assembler
(С) Сафонов В.О. 2013

Когда используется JNI
Необходимо выполнить какие-либо системные задачи (поддержки которых нет в стандартной библиотеке)
Необходимо использовать уже существующую библиотеку (legacy code)
Необходимо обеспечить эффективность выполнения кода
(С)Сафонов В.О. 2013

Пример разработки программы, использующей JNI
Шаги
1.Создать исходный код класса с объявлением native- метода.
2.Скомпилировать этот файл компилятором javac.
3.Использовать утилиту javah для генерации С header- файла.
4.Написать реализацию native-метода на C++.
5.Скомпилировать код на C, создав native-библиотеку.
6.Запустить программу, используя интерпретатор java.
(С)Сафонов В.О. 2013

Пример. Шаг 1. Файл HelloWorld.java
public class HelloWorld
{
static
{
System.loadLibrary(“libhello”);
}
public native void sayHello();
public static void main(String[] args)
{
new HelloWorld().sayHello();
}
}
(С) Сафонов В.О. 2013

Пример. Шаг 1. Native-методы
Метод sayHello() объявлен с ключевым словом “native”. Это означает, что он не требует реализации на Java и будет реализован как машинно-зависимый.
(С) Сафонов В.О. 2013

Пример. Шаг 2. Компиляция HelloWorld.java
javac HelloWorld.java
HelloWorld.java -> HelloWorld.class
(С) Сафонов В.О. 2013

Пример. Шаг 3. javah
javah – утилита, входящая в JDK и служащая для связи между кодом на C/C++ и Java
javah генерирует C header-файлы (*.h) по байт-коду класса Java, содержащему ссылки на native- методы
(С) Сафонов В.О. 2013

Пример. Шаг 3. javah
javah HelloWorld
HelloWorld.class -> HelloWorld.h
(С) Сафонов В.О. 2013

Пример. Шаг 3. HelloWorld.h
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus
extern "C" { #endif
/*
*Class: HelloWorld
*Method: sayHello
*Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_sayHello (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
(С) Сафонов В.О. 2013