My Blog

Call Windows API from JAVA

by lupok on giovedì 17 gennaio 2013 17:10

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; 

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

Blogs Parent Separator My Blog
Author
lupok

My Blog

Tags