Per prima cosa è necessario creare un'applicazione JAVA, io ho utilizzato Eclipse (di cui allego progetto completo) ed ho creato una classe contenente la chiamata ad una funzione nativa:
public class WindowsAPI {
public native int WindowsLockWorkStation();
static
{
try
{
System.loadLibrary("WindowsAPI");
}
catch(Exception ex )
{
System.out.println(ex.getMessage());
}
}
}
Come si vede dal codice riportato sopra, è necessario dichiare un metodo senza corpo in cui è presente la parola chiave "native", quindi si specifica il modulo (in questo caso un DLL) in cui è presente la funzione da importare invocando "System.loadLibrary" e specificando il nome della libreria.
Una volta generati i file .class è necessario generare con l'utility "javah" un file .h necessario per l'implementazione del metodo nativo in C.
C:\Works\Eclipse\Workspace\TestJNIWindows\src>"c:\Program Files\Java\jdk1.7.0_03\bin\javah" -jni WindowsAPI
Generato l'header "WindowsAPI.h" dobbiamo procedere con l'implementazione del metodo nativo:
1) creare un'applicazione console in vc++;
2) selezionare "DLL" in "Application Type";
3) includere jni.h e jni_md.h, rispettivamente nelle directory C:\Program Files\Java\jdkX.Y.Z\include e C:\Program Files\Java\jdkX.Y.Z\include\win32;
![](/Portals/0/Articles/CallWindowsAPIFromJAVA/Immagine1.png)
4) importare nel progetto l'header creato mediante il comando "javah":
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class WindowsAPI */
#ifndef _Included_WindowsAPI
#define _Included_WindowsAPI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: WindowsAPI
* Method: WindowsLockWorkStation
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_WindowsAPI_WindowsLockWorkStation
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
5) implementare le funzioni esportate (nel nostro caso "Java_WindowsAPI_WindowsLockWorkStation"):
// WindowsAPI.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#include "WindowsAPI.h"
JNIEXPORT jint JNICALL Java_WindowsAPI_WindowsLockWorkStation(JNIEnv *, jobject)
{
return ::LockWorkStation() ? 0: 1;
}
6) Compilare il progetto facendo attenzione al tipo di sistema utilizzato, nel caso il l'applicazione venga eseguita su un sistema a 64 bit la dll, deve essere compilata con platform x64;
7) Copiare la dll generata nella stessa directory in cui sono presenti i file .class
8) Per eseguire l'applicazione:
C:\Works\Eclipse\Workspace\TestJNIWindows\bin>java Main
TestJNIWindows.zip