IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Exécuter du code natif à partir de Java avec JNA en 5 minutes
Un tutoriel de Mickael Baron

Le , par Mickael Baron

15PARTAGES

6  0 
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

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de bouye
Rédacteur/Modérateur https://www.developpez.com
Le 06/03/2017 à 5:13
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 : Sélectionner tout
      __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
0  0 
Avatar de Mickael Baron
Rédacteur https://www.developpez.com
Le 06/03/2017 à 20:47
Salut Fabrice,

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

Mickael
0  0 
Avatar de bouye
Rédacteur/Modérateur https://www.developpez.com
Le 07/03/2017 à 1:24
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.
0  0 
Avatar de eclesia
Rédacteur https://www.developpez.com
Le 09/03/2017 à 19:24
Pour information il y a un troisieme compétiteur :
JNR-FFI

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