Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

пятница, 8 мая 2009 г.

Простой пример использования JNI

JNI - Java Native Interface - технология, которая позволяет из программы на Java вызывать функции, написанные на других языках, и обратно: из native-функций вызывать методы Java.

Рассмотрим простейший пример, в котором из программы на Java вызывается функция на Си, печатающая в консоли "Hello, World!".

ШАГ 1. Создание Java-программы

Напишем класс, который содержит один native-метод, а в методе main происходит вызов этого метода.

A.java:


public class A {

public static native void displayHelloWorld();

static {
System.loadLibrary("hello");
}

public static void main(String[] args) {
displayHelloWorld();
}
}


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:


/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class A */

#ifndef _Included_A
#define _Included_A
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: A
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_A_displayHelloWorld
(JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif


ШАГ 3. Создание и компиляция native-функции

Напишем следующий код на Си, файл A.c:


#include <jni.h>
#include "A.h"
#include <stdio.h>

JNIEXPORT void JNICALL
Java_A_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello, world!\n");
return;
}


После этого откомилируем и создадим 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!".

Комментариев нет:

Отправить комментарий

Постоянные читатели