Я должен был сделать это некоторое время назад.Вам понадобится компилятор 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 вы включаете все необходимые заголовки Windows и уточняете метод.
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 или выделением памяти, это ухудшается (примечание: я этого не делал, поэтому у меня нет опыта).
Здесь есть целый учебник здесь (Сначала я нашел сегодня, что выглядел прилично, и вы можете найти других в Интернете. В статье Wikipedia о JNI тоже есть дополнительная информация.
Надеюсь, это поможет.