Partage
  • Partager sur Facebook
  • Partager sur Twitter

[JNA] Retour de fonction par string

Sujet résolu
    26 septembre 2011 à 15:56:37

    Bonjour,

    J'ai posé mes premières bases avec JNA (Java Native Access). Mais il me reste un problème: lorsque le retour de fonction est une chaine de caractères.

    Je vois deux façons de faire, mais dans les deux cas je ne sais pas comment m'y prendre:
    extern "C" const char* ecrire1(const char* input);
    extern "C" void ecrire2(const char* input , char* output);
    


    La gestion de l'input ne me pose pas de problème. Par contre, je ne parviens pas à récupérer ma sortie sous forme de chaine de caractères.

    Quelqu'un aurait un exemple à me proposer ?
    Merci d'avance,

    Caduchon.
    • Partager sur Facebook
    • Partager sur Twitter
    Je ne suis responsable que de ce que je dis, pas de ce que vous comprenez... - /!\ Négligences de sécurité sur OpenClassrooms /!\
      27 septembre 2011 à 4:21:47

      A priori, il faudrait utiliser un tableau de byte[] et y appliquer par la suite un toString(). Des pistes ici :
      => http://markmail.org/message/n2xo32eyyo6d2zgc
      => https://github.com/twall/jna/blob/mast [...] dQuestions.md (voir "How do I read back a function's string result?")
      • Partager sur Facebook
      • Partager sur Twitter
        27 septembre 2011 à 10:09:21

        En effet.
        Merci beaucoup ! :magicien:



        Voilà ma solution finale pour les intéressés (un protocole de communication par strings):

        Librairie en C++ nommée PingPong.cpp:
        // Fonction chargée d'estimer la longueur maximum de la réponse à cette requête
        extern "C" int estimateMaximumOutputLength(const char* request)
        {
          return 6;
        }
        
        // Fonction exécutant une requête et y répondant
        extern "C" int sendRequest(const char* request, char* output, int outputLength)
        {
                std::string req(request);
                if(req == std::string("ping"))
                {
                        output[0] = 'p';
                        output[1] = 'o';
                        output[2] = 'n';
                        output[3] = 'g';
                        output[4] = '\0';
                        return 4;
                }
                else
                {
                        output[0] = 'P';
                        output[1] = 'O';
                        output[2] = 'U';
                        output[3] = 'E';
                        output[4] = 'T';
                        output[5] = '\0';
                        return 5;
                }
        }
        


        Compilation:
        g++ -fPIC -shared -Wall PingPong.cpp -o libPingPong.so
        


        Interface Java pour la librairie:
        package com.caduchon.pingpong;
        
        import com.sun.jna.Library;
        
        public interface PingPongLibrary extends Library
        {
          public int estimateMaximumOutputLength(String request);
          public void sendRequest(String request, byte[] output, int outputLength);
        }
        


        Encapsulation dans une classe plus pratique:
        package com.cenaero.component.minamo;
        
        import com.sun.jna.Native;
        
        public class PingPongCommunicator
        {
          private PingPongLibrary lib;
          
          public PingPongCommunicator()
          {
            this.lib = (PingPongLibrary)Native.loadLibrary("PingPong", PingPongLibrary.class);
          }
          
          public String sendRequest(String request)
          {
            int outputLength = this.lib.estimateMaximumOutputLength(request) + 2;
            byte[] output = new byte[outputLength];
            this.lib.sendRequest(request, output, outputLength);
            String response = Native.toString(output);
            return response;
          }
          
        }
        


        Utilisation:
        PingPongCommunicator pingpong = new PingPongCommunicator();
        String response = pingpong.sendRequest("ping");
        System.out.println("Response = " + response);
        
        • Partager sur Facebook
        • Partager sur Twitter
        Je ne suis responsable que de ce que je dis, pas de ce que vous comprenez... - /!\ Négligences de sécurité sur OpenClassrooms /!\
          27 septembre 2011 à 10:59:54

          J'y pensais aussi, car c'est assez pauvre en documentation. Mais je débute en java, alors il me faudra un coach de ce côté là aussi. ;)
          Sans doute pour Noël, quand j'aurai un peu d'expérience dans mon projet.

          (Et comment-ça c'est pas une bonne idée de commencer le java avec JNA ?!! :pirate: )
          • Partager sur Facebook
          • Partager sur Twitter
          Je ne suis responsable que de ce que je dis, pas de ce que vous comprenez... - /!\ Négligences de sécurité sur OpenClassrooms /!\

          [JNA] Retour de fonction par string

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown