Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что такое JNI - простейший пример. 
:(
    Опции темы
AntonSaburov
Дата 2.12.2004, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



JNI - Java Native Interface.
Перевод не даст общей идеи, которая заключается в том, что из JVM можно запустить код, который написан на какой-либо компилируемом языке (например на C) и лежит на диске в виде .dll (для Unix это обычно .so)

Достаточно полное описание можно найти здесь
Trail: Java Native Interface: Table of Contents

А ниже сделан очень простой вариант использования JNI.

Итак, что надо:

1. Создаем обычный класс на JAVA, но тот метод, который должен использовать dll описываем как native. Кроме этого используем вызов, который загружает нашу dll.

Код

public class JniTest  
{
    static 
    {
        System.loadLibrary("JniTest");
    }

    public native int showString(String message);  // обращаем внимание на слово native
}


Теперь компилируем наш пример
javac JniTest.java

Если ничего страшного не произошло, то по идее мы должны получить файл JniTest.class.

Теперь обработаем его утилитой javah. Эта утилита создаст нам .h файл для нашей программы.
Важно: надо писать файл без расширения.

javah -classpath . JniTest

Получаем файл JniTest.h вот такого вида. 

Код

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

#ifndef _Included_JniTest
#define _Included_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JniTest
 * Method:    showString
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_JniTest_showString
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif


Редактировать его уже не надо. Его надо просто включить в наш файл CPP, который показан ниже.

Код

#include <stdio.h>
#include "JniTest.h"

JNIEXPORT jint JNICALL Java_JniTest_showString(JNIEnv * jenv, jobject jobj, jstring message)
{
  const char *string = jenv->GetStringUTFChars(message, 0);
  printf("%s\n",string);
  jenv->ReleaseStringUTFChars(message, string);

  return 0;
}


В нем следует обратить внимание на обработку строк. Остальные переменные обычно не так сложны. А тут видим, что надо вытащить строку из Unicode в обычный char.
Теперь сделаем dll для нашего проекта. ЛУчше было бы, чтобы в системе уже был прописан путьдо компилятора.
JAVA_HOME - это переменная среды, которую я всегда прописываю. Вообще это путь до директории с установленной JAVA - например, C:\j2sdk1.4.2_06. (Думаю, что это понятно)

cl -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -LD JniTest.cpp -FeJniTest.dll

cl - это компилятро С++ из Visual C++. Вы можете использовать любой другой компилятор. Тут важно собрать наши искходники на Си для получения DLL.

Видно, что результатом компиляции должна быть JniTest.dll. Кстати, для Unix-систем должен быть файл вида libJniTest.so. Вот такая особенность. Нужен префикс lib.

Теперь создаем тестовый пример. 

Код

public class ShowJniTest
{
    public static void main(String[] args)
    {
        JniTest jt = new JniTest();
        jt.showString("Hello, world!");
        jt.showString("JNI is great!");
    }
}


Собираем
javac -classpath . ShowJniTest.java

И запускаем
java -classpath . ShowJniTest

Должно сработать smile
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.