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 :

Utilisation de JNA


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Août 2007
    Messages : 86
    Par défaut Utilisation de JNA
    Salut

    actuellement je fait une application où je doit intégrer un code écrit en C a mon programme qui est en Java pour cela j'utilise la JNA(Java Native Access) donc en faisant un essai où j'appelle la fonction "sethello" qui se trouve dans le programme en C après avoir appuyé sur un bouton de mon interface java.
    j'ai suivis les instruction de ce tutoriel Exécuter du code natif en Java : JNI VS JNA le problème c'est que j'arrive pas à faire que l'interface "User" trouve le chemin du programme en C

    voici la classe java
    Code : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    package hello;
     
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
     
    import javax.swing.JFrame;
     
    import com.sun.jna.Native;
     
    public class World {
     
    	private JFrame frame;
     
    	/**
             * Launch the application
             * @param args
             */
    	public static void main(String args[]) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					World window = new World();
    					window.frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
     
    	/**
             * Create the application
             */
    	public World() {
    		createContents();
    	}
     
    	/**
             * Initialize the contents of the frame
             */
    	private void createContents() {
    		frame = new JFrame();
    		frame.getContentPane().setLayout(null);
    		frame.setBounds(100, 100, 345, 196);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		final JButton button = new JButton();
    		button.addActionListener(new ActionListener() {
    			public void actionPerformed(final ActionEvent arg0) {		
     
    				User lib = User.demo;
    				lib.sethello(4);
    			}
    		});
    		button.setText("New JButton");
    		button.setBounds(113, 56, 106, 26);
    		frame.getContentPane().add(button);
    	}
     
    }
    l'interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    package hello;
     
    import com.sun.jna.Native;
    import com.sun.jna.win32.StdCallLibrary;
     
    public interface User extends StdCallLibrary{	
    	public int sethello (int i);
    	User demo = (User) Native.loadLibrary("hello", User.class); 
     
    }
    et voici le code C
    Code : 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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void) {
    	int i=sethello(4);
    	printf("%ld\n",i);
    	return EXIT_SUCCESS;
    }
     
    int sethello (int i){
    	int j;
    	for (j = 0 ; j < i ; j++)
    	    {
    	puts("!!!Hello World!!!\n"); /* prints !!!Hello World!!! */
    	    }
    	return i;
    }
    quand j'appuie sur le bouton j'obtiens ce message:
    Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Unable to load library 'hello': Le module spécifié est introuvable.

    merci pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Ca ressemble au fait que ton hello.dll n'est pas dans le library path de java. Sous windows il me semble que c'est dans C:\WINDOWS\system32 (ou 64 suivant ton architecture) par défaut, mais tu peux passer une option à ta jvm pour le changer si tes bibliothèques natives sont ailleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -Djava.library.path=C:\chemin\vers\répertoire
    A plus

  3. #3
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Août 2007
    Messages : 86
    Par défaut
    merci pour la reponse mais ce que je cherche a faire c'est d'indiquer le chemin dans le code, j'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.setProperty("jna.library.path", "D:\\Nouveau dossier\\hello\\src " );
    User lib = (User) Native.loadLibrary("hello.c", User.class);
    mais j'ai toujours la même erreur.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Cette propriété système est en quelque sorte read only, car si tu peux changer la valeur, la nouvelle n'est pas prise en compte pour autant. La valeur doit être mise au démarrage de la VM, par exemple en passant l'option comme indiqué.
    Ensuite tu dois pouvoir faire ton classloader qui va chercher au bon endroit si tu le veux, et si tu ne veux pas passer une option ou copier ta dll dans le répertoire qui va bien... Mais je suis pas sûr que ça soit ntéressant dans ton cas

  5. #5
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Août 2007
    Messages : 86
    Par défaut
    oui ce serai pas intéressant, donc je ne peut pas changer la valeur sur le code ? car le code c'est pas une librairie de Windows mais un code que j'ai fait moi même.
    est ce que quand j'aurai créer le fichier JAR le code C en fera partie? ou il faudra que je le donne à mon enseignant avec le repertoire où il devra le copier pour le faire marche?

Discussions similaires

  1. utilisation de jna
    Par anisj1m dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 20/01/2009, 18h53
  2. Comment utiliser JNI ou JNA
    Par mimi51340 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 23/11/2008, 16h37
  3. Réponses: 28
    Dernier message: 23/10/2008, 15h06
  4. [JNA] documentation sur l'utilisation des biliothèques natives
    Par soft0613 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 17/12/2007, 15h48

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