Вызов метода API Win32 из Java
Мне нужно вызвать некоторые методы в Wininet.dll из программы Java.
Я могу найти множество руководств о том, как вызывать новую DLL, которую я создаю с Java, но я не могу найти никаких учебников о том, как вызывать уже существующую DLL из Java.
Я знаю, что это связано с JNI, но как именно я это делаю? Нужно ли мне звонить javah
на Wininet.h? Где я могу получить копию Wininet.h? Указатель на существующий подробный учебник будет достаточным.
Ответы
Ответ 1
Ответ 2
Я должен был сделать это некоторое время назад. Вам понадобится компилятор C и заголовочные файлы Windows. Я использовал mingw, потому что он бесплатный, и я только составлял один маленький файл.
Сначала вы создаете свой класс. Вот пример:
package org.whatever.thingy;
public class MyClass {
// Here is a JNI method, identified by 'native'
public static native callWin32Thingy(int x, int y, boolean z);
/* At this point, normal class stuff, other methods, variables, whatever */
}
Затем вы используете одну из команд, которые входят в JDK, которая автоматически возьмет ваш класс и сгенерирует файлы .h и .c. Команда "джава". Подпись метода будет выглядеть примерно так:
JNIEXPORT void JNICALL Java_com_whatever_1thingy_MyClass_callWin32Thingy
(JNIEnv *, jclass, jint, jint, jboolean);
В .c файле вы включаете все заголовки окон, которые вам нужны, и создавайте метод.
JNIEXPORT void JNICALL Java_com_whatever_1thingy_MyClass_callWin32Thingy
(JNIEnv *a, jclass b, jint c, jint d, jboolean e) {
// Prep steps....
Win32MethodCallWeCareAbout(x, y, z, hWhatever);
// Cleanup stuff...
}
Очень важно, чтобы вы не переименовали метод, так как он связан с вашим конкретным классом.
Как только вы получите это, вы скомпилируете эти файлы в DLL. Вот команды, которые я использовал для mingw, вам придется настраивать классы/пути/etc.
c:/MinGW/bin/gcc -c -Ic:/MinGW/include -I"c:/Program Files/Java/jdk1.5.0_12/include"
-I"c:/Program Files/Java/jdk1.5.0_12/include/win32" -D__int64="long long"
com_whatever_thingy_MyClass_JNIHelper.c
c:/MinGW/bin/gcc -shared -o JNIHelper.dll
com_whatever_thingy_MyClass_JNIHelper_JNIHelper.o
-Wl,--add-stdcall-alias,--kill-at,--output-def,def_file
Это создаст некоторые файлы, в том числе JNIHelper.dll, и это то, что я назвал своей DLL.
В этот момент вы в основном делаете. Вы используете свой Java-класс как обычно, и он запускает ваш код Win32 при вызове статического метода. Все, что вам нужно сделать, это импортировать библиотеку. Где-то в вашем коде (я помещал его в статический блок в моем классе) вам понадобится следующая строка:
System.loadLibrary("JNIHelper");
Это приведет к тому, что Java загрузит библиотеку с именем "JNIHelper.dll" и свяжет ее с кодом. Он должен быть где-то в пути к библиотеке, о котором знает Java.
Что это. Это куча шаблонов, но если вы делаете какую-то простую упаковку, это легко. Если вам приходится иметь дело с типами Java или распределять память, это ухудшается (примечание: я этого не делал, поэтому у меня нет опыта там).
Здесь есть целый учебник (сначала я нашел сегодня, что выглядел прилично, и вы можете найти других в Интернете. Wikipedia в статье JNI также есть дополнительная информация.
Надеюсь, что это поможет.
Ответ 3
Нельзя напрямую обращаться к родным библиотекам: это связано с тем, что некоторые аргументы в методах не поддерживаются интерфейсом Java Native.
Есть что-то, называемое GlueGen, это создаст отдельный двоичный файл, который будет динамически связываться с вашей родной DLL. Сгенерированный двоичный файл совместим с JNI и, следовательно, может быть вызван из Java.
http://en.wikipedia.org/wiki/Gluegen
Чтобы получить заголовочный файл для wininet.dll, вероятно, вам понадобится Platform SDK (или Windows SDK, самая новая версия). Вы также можете искать сеть для онлайн-репозитория, содержащего этот заголовочный файл.
GlueGen понадобится заголовочный файл, компилятор ANSI C и т.д.
Существует также менее известная библиотека под названием NativeCall, для которой не требуется GlueGen. У него уже есть двоичные файлы, совместимые с Java. Это, очевидно, медленнее, поскольку он будет динамически загружать DLL по запросу Java. Я еще не использовал это, но это звучит многообещающе:
http://johannburkard.de/software/nativecall/