Рассмотрим простейший пример, в котором из программы на Java вызывается функция на Си, печатающая в консоли "Hello, World!".
ШАГ 1. Создание Java-программы
Напишем класс, который содержит один native-метод, а в методе main происходит вызов этого метода.
A.java:
|
Native-методы обозначаются ключевым словом native. В данном классе объявлен один native-метод: displayHelloWorld(). Он не принимает никаких аргументов, и также не возвращает значения. Этот метод находится в динамически загружаемой библиотеке "hello" (для Windows это будет hello.dll).
Загрузка библиотеки осуществляется вызовом метода System.loadLibrary. Не нужно передавать расширение файла этому методу. Для Windows это расширение предполагается dll по умолчанию. Вызов метода System.loadLibrary помещен в статический блок. Выполнение этого блока осуществляется при загрузке класса.
ШАГ 2. Компиляция
Откомпилируем файл A.java командой:
javac A.java
После этого следует создать заголовочный файл (файл с расширением ".h"), в котором содержится объявление вызываемой функции. Для генерации заголовочного файла следует использовать утилиту javah:
javah -jni A
В результате будет создан следующий заголовочный файл A.h:
|
ШАГ 3. Создание и компиляция native-функции
Напишем следующий код на Си, файл A.c:
|
После этого откомилируем и создадим dll-библиотеку следующей командой:
cl -I"C:\Program Files\Java\jdk1.6.0_12\include"
-I"C:\Program Files\Java\jdk1.6.0_12\include\win32"
-I"C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include"
-LD A.c
-Fehello.dll
Опция -I компилятора cl определяет директории с заголовочными файлами. Здесь определено три директории: две первые содержатся в JDK, а третья содержится в MS Visual Studio, и она содержит заголовочный файл stdio.h. Опция -LD говорит компилятору, что нужно создать DLL-библиотеку, а опция -Fe определяет имя этой библиотеки.
В результате должна быть создана библиотека hello.dll.
ШАГ 4. Выполнение
Команда на выполнение java-программы:
java A
В результате на консоль должно быть выведено сообщение
"Hello, world!".