JNA, utiliser du code natif avec Java, démonstration

Pour utiliser du code natif avec Java, JNA est plus simple que JNI, en voici une démonstration basique...

Java Native Access est une extension à Java qui permet d'utiliser des APIs natives en incluant dynamiquement des fichiers de bibliothèque, des DLL sous Windows.
Contrairement à JNI, on n'a plus besoin de générer du code pour utiliser des fonctions natives. Pour utiliser des fonctions C, il suffit d'inclure le fichier qui les définit et de déclarer l'en-tête de ces fonctions dans une interface.

Nous voulons utiliser la fonction puts du langage C, qui est fournie par le fichier msvcrt.dll sous Windows, on crée l'interface suivante:

package CInterface; 
       
import com.sun.jna.Library; 
       
public interface CInterface extends Library 
{ 
      public int puts(String str);
}     

Nous avons déclaré l'interface CInterface qui est une sous-classe de jna. Dans cette interface, les fonctions C sont déclarées comme méthodes. Pour utiliser la méthode puts, il suffit de créer une instance de CInterface.

 CInterface demo = (CInterface) Native.loadLibrary(libName, CInterface.class); 
 demo.puts("Hello World!");

Pour que cela fonctionne, les imports suivants sont nécessaires:

import com.sun.jna.Library; 
import com.sun.jna.Native;
import com.sun.jna.Platform;

En outre, la librairie jna.jar doit être incluse dans le projet.

Le projet complet pour NetBeans peut être téléchargé. Il contient deux sources:
- CInterface.java qui déclare l'interface ci-dessus.
- hello.java qui utilise cette interface.

Pour faire fonctionner la démonstration:

  1. Télécharger et installer NetBeans.
  2. Télécharger ici le fichier projet, il se désarchive dans le répertoire jna.
  3. Télécharger la librairie jna.jar sur le site de Sun et la copier dans le répertoire jna.
  4. Charger le projet dans NetBeans à partir de ce répertoire.
  5. Ajouter jna.jar à la liste des librairies:
    Propriétés du projet -> Libraries -> Add JAR/Folder.
  6. Compiler le projet.

Puis taper en ligne de commande:

java -jar /jna/dist/hello.jar "Salut le Monde!"

Vous pouvez ajouter à l'interface toutes les fonctions dont vous avez besoin, si elles sont présentes dans le même fichier DLL, et créer une interface pour chaque fichier DLL à inclure.

Code source complet:

// JNA Demo. Scriptol.fr
package CInterface;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public class hello
{
public static void main(String[] args)
{
String mytext = "Hello World!";
if (args.length != 1)
{
System.err.println("You can enter you own text between quotes...");
System.err.println("Syntax: java -jar /jna/dist/demo.jar \"myowntext\"");
}
else
mytext = args[0];
// Le nom est c pour Unix et msvcrt pour Windows
String libName = "c";
if (System.getProperty("os.name").contains("Windows"))
{
libName = "msvcrt";
}
// Chargement dynamique de la librairie
CInterface demo = (CInterface) Native.loadLibrary(libName, CInterface.class);
demo.puts(mytext);
}
}

Télécharger le code

Voir le projet Github Java Native Access pour obtenir jna.jar.