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] Récupération char[] par référence


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 154
    Par défaut [JNA] Récupération char[] par référence
    Bonjour,

    J'essaie d'accéder à une fonction d'une dll via JNA. Le problème c'est que dans cette fonction, les 4 derniers paramètres sont des paramètres de sortie. Le truc c'est que je ne sais pas comment les récupérer.

    Voici l’entête de la méthode en C:
    unsigned short Lec_IntroductionMstCPS ( unsigned short usNoSession,
    short sTempsAttente,
    char tcCodeCivilite[2],
    char szNomPatronymique[27],
    short * psEtatCarte,
    unsigned short * pusCodeErreur );
    j'ai ça dans mon interface JNA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public short Lec_IntroductionMstCPS ( NativeLong usNoSession, short sTempsAttente, PointerByReference tcCodeCivilite, PointerByReference szNomPatronymique, ShortByReference psEtatCarte, NativeLongByReference pusCodeErreur );
    Puis j'appelle la méthode comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    PointerByReference tcCodeCivilite = new PointerByReference();
    		PointerByReference szNomPatronymique = new PointerByReference();
    		ShortByReference psEtatCarte = new ShortByReference();
    		NativeLongByReference pusCodeErreur = new NativeLongByReference();
     
    		retour = wrapperVitale.Lec_IntroductionMstCPS(numeroSessionCps, (short)0, tcCodeCivilite, szNomPatronymique, psEtatCarte, pusCodeErreur);
     
    		Pointer codeCivilite = tcCodeCivilite.getValue();
    		Pointer nom = szNomPatronymique.getValue();
    		short etatCarte = psEtatCarte.getValue();
    		NativeLong erreur = pusCodeErreur.getValue();
    		return retour;
    Je récupère bien tout mais les variables codeCivilite, nom et etatCarte sont remplies avec des données louches (native@0x32434f44 contenant une données peer avec pour valeur un long). Moi je veux juste récupérer un string... Comment faire??

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    La méthode getValue() de PointerByReference renvoi un objet Pointer, qu'il faut donc également manipuler.

    Mais dans ton cas il y a plus simple :
    • Pour les tableaux tu peux directement passer un tableau Java du type correspondant...
    • pour les short* tu peux passer directement par un ShortByReference



    a++

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 154
    Par défaut
    Et si je passe un tableau en paramètre, il va bien être renseigné par ma fonction native?? Car je rappelle que le paramètre est un paramètre de sortie. Il me semblait qu'il fallait utiliser des types ...ByReference pour cela...

    Quoi qu'il en soit, je teste ça demain

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 154
    Par défaut
    Merci beaucoup ça marche...

    Cependant, je bloque maintenant sur un autre problème.

    Voici le descriptif de la méthode de la DLL:
    unsigned short Lec_LectureVitale ( unsigned short usNoSession,
    unsigned short usNoSessionCPS,
    char * pcDataOut,
    unsigned int * puiLgDataOut,
    unsigned short * pusCodeErreur );
    Le champ posant problème est le puiLgDataOut. Voici le descriptif:
    • 1/ entrée: taille allouée en entrée à DataOut.
    • 2/ sortie: taille occupée par les données restituées.

     Valeur non nulle passée par adresse => adresse non nulle
     En entrée, allouer une taille de 100 Ko à cette zone de mémoire.
    La fonction vérifie si cette taille est suffisante pour recevoir les données lues.
    Si elle est insuffisante, la fonction retourne ERR_PARAMETRE.
    Je déclare quel type moi et je l'initialise comment?

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Ben... IntByReference non ?


    a++

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 154
    Par défaut
    Je suis d'accord mais en entrée ils disent qu'il faut allouer une taille de 100ko à cette zone de mémoire.
    Moi j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IntByReference puiLgDataOut = new IntByReference();
    Memory mem = new Memory(102400);
    puiLgDataOut.setPointer(mem);
    Le problème c'est que la fonction me renvoie toujours une erreur 54 correspondant à ERR_PARAM_VALEUR. J'en déduit donc que ce que je passe est foireux...

Discussions similaires

  1. [RegEx] Récupération variable passé par référence
    Par Aurélien LEQUOY dans le forum Langage
    Réponses: 3
    Dernier message: 11/06/2013, 09h09
  2. Passer un char** par référence
    Par Nightmare Theater dans le forum Débuter
    Réponses: 13
    Dernier message: 07/12/2011, 15h30
  3. Récupération de donnée par référence impossible
    Par Kahor5 dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 19/01/2009, 13h38
  4. Réponses: 3
    Dernier message: 09/10/2007, 10h50
  5. Réponses: 10
    Dernier message: 03/03/2005, 13h36

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