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 :

Exécution d'une DLL Fortran depuis un programme Java - JNA


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur projet
    Inscrit en
    Juin 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 46
    Points : 43
    Points
    43
    Par défaut Exécution d'une DLL Fortran depuis un programme Java - JNA
    Bonjour,
    Je rencontre un problème pour charger une dll fortran à partir d'un programme java en utilisant JNA (JAVA Native Access).

    Voici le code fortran "FortranDLL.for" utilisé pour générer la dll (FortranDLL.dll) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     subroutine Ecriture()
     
        !DEC$ ATTRIBUTES DLLEXPORT:: Ecriture
        !DEC$ ATTRIBUTES ALIAS : "Ecriture" :: Ecriture
     
        implicit none
        integer :: i
        open(11, file="fichier_test.dat")
            do i=0,100
                write(11,*)i," ",i*i
            end do
        close(11)
    end subroutine Ecriture
    Je génère donc cette dll à partir de Microsoft Visual Studio, et souhaite lancer la subroutine "Ecriture() à partir d'un programme Java pour générer un fichier.
    Le code java est développé sous Eclipse. Mon programme se compose de trois fichiers :
    - Main.java
    - Launch_DLL.java
    - FInterface.java

    Voici le code du fichier main.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Main {
     
    	@SuppressWarnings("unused")
    	public static void main(String[] args) {
    		Launch_DLL appel_dll = new Launch_DLL();
    	}
    }
    Voici le code du fichier Launch_DLL.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import com.sun.jna.Native;
     
    public class Launch_DLL {
    	  public Launch_DLL() 
    	  { 		    
    		// Chargement dynamique de la librairie
    		FInterface demo = (FInterface) Native.loadLibrary("FortranDLL.dll", FInterface.class); 
    		demo.Ecriture();
    		System.out.println("chargement dynamique de la librairie réussi ...");
    	  }
    }
    Voici le code du fichier FInterface.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import com.sun.jna.Library; 
     
    public interface FInterface extends Library 
    {  
    	public void Ecriture();
    }
    Les fichiers FInteface.java et Launch_DLL.java sont utilisés pour gérer l'interface du code Java avec la dll. Je souhaite en exécutant cette dll générer un fichier "fichier_test.dat" via l'éxécution de la routine "Ecriture".
    J'ai au préalable pris le soin de placer la dll dans le bon répertoire, et utilise la bibliothèque JNA (https://maven.java.net/content/repos.../jna-4.1.0.jar) pour compiler le système.

    A la compilation du code, j'ai le message d'erreur suivant qui apparaît au moment de l'appel de la dll :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Exception in thread "main" java.lang.UnsatisfiedLinkError: %1 n’est pas une application Win32 valide.
     
    	at com.sun.jna.Native.open(Native Method)
    	at com.sun.jna.Native.open(Native.java:1759)
    	at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260)
    	at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
    	at com.sun.jna.Library$Handler.<init>(Library.java:147)
    	at com.sun.jna.Native.loadLibrary(Native.java:412)
    	at com.sun.jna.Native.loadLibrary(Native.java:391)
    	at Launch_DLL.<init>(Launch_DLL.java:9)
    	at Main.main(Main.java:6)
    Travaillant sur une station de travail en 64 bits, j'ai d'abord pensé à un problème de compilation de la dll, mais je ne vois pas comment compiler autrement ma dll. Dans les options de Visual Studio, c'est bien "Microsoft Windows 32-bit" qui est sélectionné dans les propriétés de FortranDLL comme "Target Environment".

    Je vous remercie par avance de l'aide que vous pourrez m'apporter.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Anthony BIGET Voir le message
    Dans les options de Visual Studio, c'est bien "Microsoft Windows 32-bit" qui est sélectionné dans les propriétés de FortranDLL comme "Target Environment".
    Et la jvm que tu utilise est bien un jvm 32 bits??

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur projet
    Inscrit en
    Juin 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    C'est la dernière version de java SE jdk-8u11 (build 1.8.0_11-b12) qui est installée sur mon poste, en version 64 bits.
    Mais normalement, les .dll compatibles 32 bits ne sont elles pas censées être utilisables sur des systèmes 64 bits ?

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Anthony BIGET Voir le message
    Mais normalement, les .dll compatibles 32 bits ne sont elles pas censées être utilisables sur des systèmes 64 bits ?
    Pas tout à fait !

    Tu peux très bien utiliser des DLL 32 bits sur un système 64 bits... mais uniquement avec des applications 32 bits.

    Donc :
    • Soit tu continues à utiliser tes DLL 32bits, et il te faudra alors passer à une JVM 32 bits.
    • Soit tu continues d'utiliser la JVM 64 bits, et il te faudra passer à des DLL 64 bits.



    a++

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur projet
    Inscrit en
    Juin 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    Je comprends la différence, mais du coup, je ne comprends pas vraiment ce qui bloque dans l'appel de la dll depuis l'interface java.
    Je pense que je vais plutôt passer par l'appel depuis mon code java d'un exécutable .exe généré à partir de mon code fortran, cela devrait simplifier les choses.

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Anthony BIGET Voir le message
    Je comprends la différence, mais du coup, je ne comprends pas vraiment ce qui bloque dans l'appel de la dll depuis l'interface java.
    Si la JVM est en 64bits, tu dois utiliser une DLL 64bits...

    Tu peux exécuter une application 32 bits sous un environnement 64 bits, mais tu ne peux pas mélanger du code 32 bits et 64 bits au sein d'une même application.

    a++

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur projet
    Inscrit en
    Juin 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    Merci pour ces précisions, je comprends mieux les problèmes que j'ai rencontré. Si je veux développer une application qui soit à la fois compatible avec les systèmes 32 et 64 bits, il est donc préférable de partir sur du 32 bits. Si je souhaite optimiser les performances du logiciel (avantages du 64 bits vs 32 bits), je devrais alors développer deux versions du logiciel avec des outils propres à chaque système.
    Encore merci pour votre aide.

  8. #8
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Anthony BIGET Voir le message
    Si je souhaite optimiser les performances du logiciel (avantages du 64 bits vs 32 bits), je devrais alors développer deux versions du logiciel avec des outils propres à chaque système.
    Uniquement pour le code natif.

    Le code Java ne pose aucun soucis de ce coté là.


    a++

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

Discussions similaires

  1. > Exécution d'une commande Dos dans un programme Java
    Par siempre dans le forum Débuter
    Réponses: 1
    Dernier message: 08/01/2012, 10h26
  2. Exécution d'une commande DOS dans un programme Java
    Par siempre dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 08/01/2012, 02h07
  3. Réponses: 2
    Dernier message: 31/08/2010, 11h58
  4. Exécuter une commande depuis un programme Java
    Par spark_legion dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 23/03/2009, 11h06
  5. Comment accéder à une DLL COM depuis un exécutable ?
    Par Denys dans le forum API, COM et SDKs
    Réponses: 10
    Dernier message: 20/09/2005, 08h04

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