Developpez.com - Rubrique Java

Le Club des Développeurs et IT Pro

Exécuter du code natif à partir de Java avec JNA en 5 minutes

Un tutoriel de Mickael Baron

Le 2017-03-02 08:30:45, par Mickael Baron, Rédacteur
Bonjour,

Je vous propose un tutoriel très court sur l'utilisation complète de JNA permettant d'appeler du code natif depuis Java.

Voici le lien du tutoriel : http://mbaron.developpez.com/tutorie...jna-5-minutes/

Profitez de cette discussion pour laisser vos commentaires

Mickael
  Discussion forum
4 commentaires
  • bouye
    Rédacteur/Modérateur
    Merci Michael,
    quelques points complémentaires concernant la compilation sous Windows.
    En effet si l'export des symboles dans la bibliothèque dynamique est automatique quand on compile avec GCC* sous Linux (et macOS dans ton cas), cela ne semble pas être le cas avec les différents compilateurs à ma disposition sous Windows :

    • gcc 4.6.3 (mingw) -> le DLL produit est 32bit, ne contient pas de symboles exportés.
    • gcc 5.3.0 (mingw) -> le DLL produit est 32bit, ne contient pas de symboles exportés.
    • gcc 6.3.0 (mingw-64) -> le DLL produit ne contient pas de symboles exportés.
    • gcc 4.9.3 (cygwin-64) -> le DLL produit ne contient pas de symboles exportés et dépend de cygwin1.dll.
    • Visual Studio 2015 -> Le DLL produit contient la définition de la fonction display() (voir ci-dessous) et dépend de vcruntime140.dll et uctrbased.dll.
      • pour exporter la fonction display() il faut mettre dans le fichier helloworld.h la ligne suivante au lieu de ce qui est écrit dans ton article :
        Code C :
        __declspec(dllimport) void display(char* ch);
        Impossible d'exporter printf() de cette façon et j'ai pas creusé donc il faudra soit définir une nouvelle fonction C qui l'invoque, soit commenter les lignes équivalentes coté Java.
      • Note: pour une compilation 64bit,
        • Dans Project->Properties changer la Platform en x64
        • Dans Project->Properties->General changer Configuration Type en Dynamic Library (DLL)
        • Dans Dans Project->Properties->Linker->Advanced changer Target Machine en Machine x64 (/MACHINE:X64) (si ce n'est pas déjà fait)




    Du coup, j'ai pu lancer le prog en utilisant le DLL généré par VC 2015 (après avoir commenté tout ce qui est en rapport avec printf() dans le code Java)

    *Vérifiable en faisant : readelf -Ws helloworld.so
  • Mickael Baron
    Rédacteur
    Salut Fabrice,

    Merci beaucoup pour tes remarques très constructive. Je vais voir comment modifier mon tutoriel.

    Mickael
  • bouye
    Rédacteur/Modérateur
    PS : pour inspecter les DLLs sous Windows et voir ce qui était exporté (ou pas), les dépendances ou la plateforme ciblée (x86 vs x64), j'ai utilisé Dependency Walker.
  • eclesia
    Rédacteur
    Pour information il y a un troisieme compétiteur :
    JNR-FFI

    Aussi simple que JNA avec les quasi-perf de JNI.