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
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
-
bouyeRédacteur/ModérateurMerci 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);
- 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)
- 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 :
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.sole 06/03/2017 à 5:13 -
Mickael BaronRédacteurSalut Fabrice,
Merci beaucoup pour tes remarques très constructive. Je vais voir comment modifier mon tutoriel.
Mickaelle 06/03/2017 à 20:47 -
bouyeRédacteur/ModérateurPS : 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.le 07/03/2017 à 1:24
-
eclesiaRédacteurPour information il y a un troisieme compétiteur :
JNR-FFI
Aussi simple que JNA avec les quasi-perf de JNI.le 09/03/2017 à 19:24