Я должен назвать некоторые методы в Wininet.dll из программы Java.
Я могу найти много учебных руководств о том, как назвать новый DLL, который я создаю из Java, но я, может казаться, не нахожу учебных руководств о том, как назвать уже существующий DLL от Java.
Я знаю, что это включает JNI, но как, точно, я делаю это? Сделайте я должен звонить javah
на Wininet.h? Где я получаю копию Wininet.h? Указатель на существующее, подробное учебное руководство был бы достаточен.
JNA кажется промышленным стандартом того, что вы хотите, "предоставляет Java-программам легкий доступ к родным разделяемым библиотекам (DLL в Windows) без написания чего-либо, кроме кода Java - не требуется JNI или родной код"
Есть также Java Foreign Function Interface -
пример использования
Если вам подходит, вы можете встроить интерпретатор JRuby и вызывать winapi через jruby-ffi, что намного проще, см. здесь, здесь, и здесь
Нельзя напрямую вызывать собственные библиотеки: это связано с тем, что некоторые аргументы в методах не поддерживаются собственным интерфейсом Java.
Есть нечто, называемое GlueGen, это создаст отдельный двоичный файл, который будет динамически связываться с вашей собственной DLL. Сгенерированный двоичный файл совместим с JNI и, следовательно, может быть вызван из Java.
http://en.wikipedia.org/wiki/Gluegen
Чтобы получить файл заголовка для wininet.dll, вам, вероятно, понадобится Platform SDK (или Windows SDK, последняя версия). Вы также можете поискать в сети онлайн-репозиторий, содержащий этот заголовочный файл.
GlueGen потребуется заголовочный файл, компилятор ANSI C и т. Д.
Существует также менее известная библиотека под названием NativeCall, которая не требует GlueGen. У него уже есть двоичные файлы, совместимые с Java. Это, очевидно, медленнее, поскольку динамически загружает DLL по запросу от Java. Я еще не использовал это, но это звучит многообещающе:
Мне пришлось сделать это недавно. Вам понадобится компилятор 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, вам нужно будет настроить классы / пути / и т. Д.
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 или распределением памяти, становится еще хуже (примечание: я этого не делал, поэтому у меня нет опыта в этом).
Здесь есть целое руководство (первое, что я нашел сегодня, оно выглядело прилично, и вы можете найти другие в Интернете. В статье Википедии о JNI также есть дополнительная информация.
] Надеюсь, это поможет.