Четверг, 17.07.2025, 20:47
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
.:: Меню ::.
.:: Категории каталога ::.
Разное [5]
Различные темы по программированию
Пакет SWT [4]
Практикуемся в написании оконных приложений на Java
Среды разработки, компиляторы и т.п [3]
Сравнения, описания, плюсы и минусы сред разработки. Сравнение компиляторов.
Java [8]
Объектно-ориентированные соображения.
Си++ [19]
Коротко и ясно
Ассемблер [6]
Машинные коды, побитно :)
Форма входа
.:: Поиск ::.
.:: Дополнительно ::.
    Хостинг от Loqo.ru
             .:: Коментируем ::.
Главная » Статьи » Текстовый материал » Java

Java 7 64 bit и JNI, реализация dll в Visual Studio 2010
Итак, попробуем в деле такого монстра как JNI
Пример взят из книги Java Native Interface, можете скачать и ознакомиться.
Создаём папку HelloWorld (ну или какую хотите =)
Для начала напишем Java класс HelloWorld.java
Code

class HelloWorld {
  private native void print();
  public static void main(String[] args) {
  new HelloWorld().print();
  }
  static {
  System.loadLibrary("HelloWorld");
  }
}

Такой вот незатейливый код.
Генерируем заголовочный файл для реализации метода print на Си.
Для этого используем утилиту, входящую в состав JDK под названием javah.
Code
javah -jni HelloWord

Напоминаю, что в нашей папке всего один файл, это HelloWorld.java
Пишем именно так, как видите, не надо добавлять расширение класса .java.
В папке появляется файл HelloWorld.h
Содержание файла следующие:
Code

/* 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: print
  * Signature: ()V
  */
JNIEXPORT void JNICALL Java_HelloWorld_print
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

Можете скомпилировать файл HelloWorld.java и даже запустить его, НО, вы сталкнётесь с такой вот ошибкой:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorld in java
.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
at HelloWorld.(HelloWorld.java:7)

Вполне логичная ошибка, так как наша native библиотека ещё не готова.
Приступаем к следующему этапу, создание dll.
Я решил создать dll воспользовавшись VS2010, так что сами как-нибудь выберите подходящий инструмент.
Файл HelloWorld.c
Code

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

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

Создаём проект в VS2010




Создаём файл HelloWorld.cpp


Не забываем указать папки где находятся заголовочные файлы Java и созданный нами HelloWorld.h


Так как я использую 64-х разрядную Java, dll тоже должна быть 64 bit, иначе
получите следующее предупреждение
Exception in thread "main" java.lang.UnsatisfiedLinkError: D:\HelloWorld\HelloWorld.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1928)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
at HelloWorld.(HelloWorld.java:7)

Чтобы включить в Visual Studio 2010 поддержку 64-х разрядного кода, нужно воспользоваться командным файлом vcvarsall.bat с параметром amd64
Он находится в папке C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC
Code
vcvarsall.bat amd64

Теперь, в настройках проекта выбираем "Диспетчер конфигураций"
В выпадающем списке "Активная платформа решения" выбираем "Создать"
В списке платформ выбираем x64, копировать параметры из <Пусто>, нажимаем ОК.
Теперь можно пользоваться этой платформой.
Нажимаем F6, строим решение.
В папке Debug или Release (как уж захотите =) находится наша dll
Копируем её в нашу папку с Java классом и запускаем наше приложение.
Code
java HelloWorld

Удачи
Категория: Java | Добавил: C0demaker (06.08.2011)
Просмотров: 5385 | Рейтинг: 4.0/1
Всего комментариев: 0

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Ant1 © 2025