JNI: Richiamare DLL .NET da Java

DOMANDA:

In Java è possibile chiamare delle funzioni contenute in una DLL .NET?


RISPOSTA:

Anche se limita fortemente l'indipendenza dalla piattaforma tipica di questo linguaggio, in Java è possibile richiamare i metodi contenuti all'interno di una DLL grazie alle librerie Jni4Net. Tali librerie permettono la creazione metodi ponte (bridge o proxy) attorno alla classe C# richiamabili da Java che si occupano della trasformazione dei dati nella comunicazione tra i due linguaggi.


Vediamo come possiamo risolvere il nostro problema:

Prerequisito:
Avere installato e configurato correttamente il Java Development Kit (qui usiamo la versione 7 update 5 del JDK) e il compilatore C# csc.exe (disponibile anche in VisualStudio).

Seguiamo attentamente le operazioni elencate di seguito:

1. Scarichiamo le librerie BIN jni4net (qui utilizziamo la versione 0.8.6)
2. Scompattiamo il file compresso appena scaricato
3. Entriamo nella cartella samples
4. Creiamo una cartella ProvaDLL
5. Creiamo una cartella work all'interno di ProvaDLL
6. Scaricate questa DLL di prova all'interno della cartella work appena creata (contiene una classe chiamata Class1 e un metodo esegui() che prende come parametro una String e, banalmente, la restituisce). Ovviamente potete usare qualunque DLL di vostro gradimento.
7. Creiamo una classe main Java LetturaDLL.java che richiami la classe e il metodo della DLL:

import net.sf.jni4net.Bridge;
import java.io.IOException;
import provajavanet.Class1; // nome package della classe C#

public class LetturaDLL {
    public static void main(String arsg[]) throws IOException {
        Bridge.init();
        Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("ProvaJavaNet.j4n.dll"));
   
        Class1 c = new Class1(); // Class1 è il nome della classe c#
        final String result = c.esegui("Richiama la DLL (lancill.blogspot.it)"); // esegui è il nome del metodo della Class1
        System.out.printf("RISULTATO : " + result);
   }
}

Salviamola nella directory ProvaDLL.

8. Creiamo un file (anche con il Blocco Note) all'interno della cartella ProvaDLL chiamiandolo generateProxies.cmd ed incollateci questo contenuto:

@echo off
copy ..\..\lib\*.* work
..\..\bin\proxygen.exe work\provajavanet.dll -wd work
cd work
call build.cmd
cd ..


echo compiling usage
javac -d work\ -cp work\jni4net.j-0.8.6.0.jar;work\ProvaJavaNet.j4n.jar LetturaDLL.java

Semplicemente stiamo creando un mini script che copia tutte le librerie necessarie all'interno di work, poi crea le classi proxy attorno alla DLL che abbiamo scaricato e le compila. 
Attenzione se non vi riconosce il comando javac dovete configurare il Path nelle variabili di sistema oppure inserire il percorso completo dove si trova il file javac.exe (del JDK).
Tutto questo può essere fatto a mano senza l'uso del file (per i meno pigri!).

9. Lanciamo il file appena creato con un doppio click e vi appariranno nella cartella work tutte le librerie, i file necessari e 3 cartelle:
- clr che contiene il sorgente C#
- jvm che contiene il sorgente Java
- target che contiene i compilati


Fatta questa operazione è solo necessario lanciare la classe LetturaDLL da console in questo modo:

cd work
java -cp jni4net.j-0.8.6.0.jar;provajavanet.j4n.jar;. LetturaDLL


L'output sarà:

RISULTATO: Richiama la DLL (lancill.blogspot.it)


Ovviamente, una volta creato tutto il pacchetto, non necessiteremo più del compilatore C#.




Commenti

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java