que tenía que hacer esto hace un rato. Necesitarás un compilador de C y los archivos de encabezado de Windows. Usé mingw porque es gratis y solo estaba compilando un pequeño archivo.
Primero haga su clase. Aquí está un ejemplo:
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 */
}
A continuación, utiliza uno de los comandos que se presenta en el JDK, que tendrá automáticamente su clase y generar .hy archivos .c. El comando es "javah". La firma del método se verá algo como esto:
JNIEXPORT void JNICALL Java_com_whatever_1thingy_MyClass_callWin32Thingy
(JNIEnv *, jclass, jint, jint, jboolean);
En el archivo .c, que incluyen todo lo que necesita ventanas cabeceras, y profundizar en el método.
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...
}
Es muy importante no se cambia el nombre del método, eso es lo que se asocia con su clase específica.
Una vez que tenga que compila los archivos en un archivo DLL. Aquí están los comandos que usé para mingw, tendrás que ajustar clases/rutas/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
Esto producirá algunos archivos, incluido JNIHelper.dll, que es lo que llamé mi DLL.
En este punto, que está básicamente hecho. Usas tu clase Java como siempre, y ejecutará tu código Win32 cuando invoques el método estático. Todo lo que tienes que hacer es importar la biblioteca. En algún lugar de su código (lo pongo en un bloque estático en mi clase) que necesita esta línea:
System.loadLibrary("JNIHelper");
Esto hará que Java para cargar la biblioteca llamada "JNIHelper.dll" y vincularlo en el código . Tiene que estar en algún lugar de la ruta de la biblioteca que Java conozca.
Eso es todo. Es un montón de repetitivo, pero si estás haciendo un envoltorio simple, es fácil. Si usted tiene que tratar con los tipos de Java o la asignación de memoria, se pone peor (nota: no lo hice, así que no tienen experiencia allí).
Hay todo un tutorial here (primero me encontré hoy que parecía decente, y se puede encontrar a otras personas en la web. El artículo Wikipedia en JNI tiene más información también.
Espero que esto ayude.
Este necesidades un bache - JNA es mucho mejor que el JNI puro para el acceso a la biblioteca nativa. –
+1: JNA es una buena opción. Aunque, debes descubrir cómo mapear la firma de la función en Java. Recientemente utilicé JNA para comunicarme con un bluetooth dispositivo a través de la API Win32 nativa – wierob
JNA es realmente astuto. Cuando se lo estaba explicando a un amigo en el trabajo la otra semana, de hecho fui tan lejos como para decirle que es "mágico". – rob