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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

[JNA] Erreur lors de l'appel de fonction venant d'une librairie


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 6
    Points
    6
    Par défaut [JNA] Erreur lors de l'appel de fonction venant d'une librairie
    Bonjour,

    Je post ici car j'ai un petit problème avec JNA (Java Native Access), après avoir suivis un tutoriel pour utiliser une librairie je suis arrivé à ces deux fichiers la :

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface Polar extends Library {
     
    	public int fnHRMCom_GetLibraryVersion();
     
    }

    la fonction est definit ainsi dans le hrmcom.h :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Get hrmcom library file version
    __declspec (dllexport) int CALLBACK fnHRMCom_GetLibraryVersion (void);

    qui est appelé ici:

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    String message = "La Librairie de Monsieur est chargée ^^";
    		System.setProperty("jna.library.path", System.getProperty("user.dir") + File.separator + "Library");
     
    		final Polar p = (Polar) Native.loadLibrary("hrmcom", Polar.class);
     
    		JOptionPane.showMessageDialog(null, message, "Info",
    				JOptionPane.INFORMATION_MESSAGE);
     
    		try
    		{
    			p.fnHRMCom_GetLibraryVersion();
    		} catch (Error e2)
    		{
    			int i = 0;
    			message = e2.getLocalizedMessage()+"\n\n"+e2.getCause()+"\n\n";
    			for( StackTraceElement st : e2.getStackTrace())
    			{
    				if(i> 15)
    					break;
    				message+=st.toString()+"\n";
    				++i;
    			}
    			JOptionPane.showMessageDialog(null, message, "Erreur",
    					JOptionPane.INFORMATION_MESSAGE);
    		}
     
    		return;

    la librairie est bien chargée , sauf que lorsque je fais appel à une fonction présente dans la dll, mais j'ai une erreur :

    Erreur looking up function 'fnHRMCom_GetLibraryVersion' : La procedure spécifiée est introuvable.

    Vous pouvez trouver la dll et le .h à cette adresse.

    Si vous avez déjà rencontré le problème ou si vous avez une idée de ce qui a pu se passer, j'attends vos réponses...

    D'avance merci.

  2. #2
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    En utilisant "dllExportViewer" sur ta dll, on voit que le nom de ta méthode est _fnHRMCom_GetLibraryVersion@0

    Sur http://jna.java.net/, on peut lire :
    My library mapping causes an UnsatisfiedLinkError
    Use a dump utility to examine the names of your exported functions to make sure they match (nm on linux, depends on Windows). On Windows, if the functions have a suffix of the form "@NN", you need to pass a StdCallFunctionMapper as an option when initializing your library interface (see here). In general, you can use a function mapper (FunctionMapper) to change the name of the looked-up method, or an invocation mapper (InvocationMapper) for more extensive control over the method invocation.
    Le StdCallFunctionMapper permet d'enlever le _ et le @0 :

    Il faut donc compléter le code de la façon suivante :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            Map<Object, Object> options = new HashMap<Object, Object>();
            options.put(Library.OPTION_FUNCTION_MAPPER, new StdCallFunctionMapper());
     
            final Polar p = (Polar) Native.loadLibrary("hrmcom", Polar.class, options);
     
            System.out.println(p.fnHRMCom_GetLibraryVersion());
    Chez moi, cela affiche "168"

    Merci pour m'avoir fait découvrir JNA. Je ne connaissais de nom que JNI.


    PS :
    Il te faudra peut être également dériver de "StdCallLibrary" dans certains cas ?
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    import com.sun.jna.win32.StdCallLibrary;
    public interface Polar extends StdCallLibrary

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup !

    Cela fonctionne très bien !

    J'ai eu quelques difficultés pour réécrire des structures mais en cherchant je suis tomber sur JNAerator que je conseil à tous si vous avez des problèmes à ce niveau la.

    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] PHP PDO erreur lors de l'appel de fonction
    Par devocx dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 04/07/2011, 11h57
  2. Réponses: 2
    Dernier message: 18/01/2008, 11h59
  3. Erreur lors de l'appel d'une fonction
    Par larimoise dans le forum MATLAB
    Réponses: 6
    Dernier message: 21/04/2007, 11h02
  4. [SQL] Erreur lors d'un appel de fonction
    Par xavier.valentin dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 13/11/2006, 22h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo