Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
12.05.2015
Размер:
1.82 Mб
Скачать

Глава 12. Ввод/вывод, апплеты и другие темы 323

Большинство программистов никогда не использует strictfp, т. к, эта кон­струкция решает небольшой круг проблем.

Native-методы

Хотя это бывает редко и совершенно случайно, но иногда может возникнуть желание вызвать подпрограмму, которая написана на другом языке, а не на Java. Как правило, такая подпрограмма существует как выполняемый код для CPU и среды, в которой вы работаете — то есть как "родной" (native) код. Например, нужно вызвать подпрограмму native-кода для достижения более быстрого времени выполнения. Или нужно использовать специализи­рованную библиотеку типа статистического пакета. Однако из-за того, что Java-программы компилируются в байт-код, который затем интерпретирует­ся (или компилируется "на лету") исполнительной системой Java, казалось бы, невозможно вызвать подпрограмму native-кода изнутри Java-программы. К счастью, это не так. В Java существует ключевое слово native, которое используется для объявления методов native-кода. После объявления эти методы можно вызывать внутри Java-программы точно так же, как вызыва­ется любой другой метод Java.

Для объявления native-метода нужно предварить его заголовок модификато­ром native, при этом, однако, не следует определять никакого тела. Например:

public native irit methO;

После объявления native-метода, следует записать сам родной метод и вы­полнить довольно сложную процедуру для связи его с кодом Java.

Большинство родных методов записываются на С. Механизм, используемый для интеграции С-кода с Java-программой, называется JNI'-интерфейсом. Эта методология была создана для Java 1.1 и затем расширена и улучшена в Java 2. (Java 1.0 использовал иной подход, который является теперь пол­ностью устаревшим.) Детальное описание JNI находится за пределами дан­ной книги, но следующее описание обеспечивает достаточную информацию для большинства приложений.

Точные процедуры native-технологии зависят от операционной среды и версий Java. Они также зависят от языка, используемого для реализации native-метода. Следующее обсуждение предполагает среду Windows 95/98/NT. Для реализации native-метода используется язык С.

Лучше всего процесс воспринимается на примере. Для начала, введем сле­дующую короткую программу, которая использует метод native с именем test ():

1 JNI (Java Native Interface) — native-интерфейс Java. — Примеч. пер.

324 Часть I. Язык Java

/I Простой пример, который использует native-метод, public class NativeDemo {

int i;

public static void main(String args[]) { NativeDemo ob = new NativeDemo();

ob.i = 10;

System.out.println("Этот ob.i перед native-методом:" + ob.i);

ob.testO; // вызов native-метода

System.out.println("Этот ob.i после native-метода:" + ob.i); }

// объявить native-метод public native void test();

// загрузить DLL, который содержит static-метод static {

System.loadLibrary("NativeDemo"); } >

Заметим, что метод test о объявлен как native и не имеет тела. Он будет реализован на С. Обратите также внимание на блок static. Как объясня­лось ранее, static-блок выполняется только один раз, когда программа на­чинает выполняться (или, более точно, когда его класс впервые загружает­ся). В данном случае он используется для загрузки ОЬи-библиотеки, кото­рая содержит native-реализацию метода test о. (Далее вы увидите, как можно создать такую библиотеку.)

Библиотека загружается методом loadLibrary (), который является частью класса system. Вот его общая форма:

static void loadLibrary(String filename)

Здесь filename — строка, которая специфицирует имя файла, содержащего библиотеку. Для среды Windows 95/98/NT предполагается, что этот файл имеет расширение .dll.

После ввода программы, откомпилируйте ее, чтобы получить файл NativeDemo.class. Затем, вы должны использовать JDK-утилиту javah.exe для получения файла C/C++ заголовка NativeDemo.h. Файл NativeDemo.h нуж­но включить в реализацию метода test (). Для построения NativeDemo.h используйте следующую команду:

javah -jni NativeDemo

' DLL (Dynamic Link Library) — библиотека программ с динамической загрузкой. — Примеч. пер.

Соседние файлы в папке JavaLit