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