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

API standards et tierces Java Discussion :

Utiliser une bibliothèque C++ en java


Sujet :

API standards et tierces Java

  1. #1
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut Utiliser une bibliothèque C++ en java
    Bien le bonjour,

    J'aimerais des précisions sur les différentes méthodes d'utiliser une bibliothèque C++ dans un projet Java.

    Je dispose d'une bibliothèque C++ (dont j'ai les sources, je peux donc la compiler de la manière qui me plait) et j'aimerais pouvoir utiliser les fonctions de cette bibliothèque dans un projet Java.
    J'ai entendu parler de JNI, quelles sont ses limites ? défauts ? Y a-t-il d'autres outils plus performants ?

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour JNI tu devras créer une DLL servant d'interface entre ta DLL et les java afin de pouvoir correctement appeler les méthodes de ta DLL originale.

    Ensuite tu a toute liberté au niveau de ton code c++

    Niveau performance tu ne seras pas sur de trouver mieux (de temps à autre java s'avère plus rapide qu'une liaison JNI ou même du C++ ceci étant dues au optimisations spécifiques de la JVM...)

    Pour commencer par exemple le chap 30 jmd dans les cours et tutoriels pour apprendre java : http://java.developpez.com/cours/
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    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
    Salut,


    Citation Envoyé par khayyam90
    J'ai entendu parler de JNI, quelles sont ses limites ? défauts ?
    Ses limites sont que tu ne peux pas appeller n'importe quelle code C++ directement depuis le code Java, mais qu'il faut créer une méthode native qui sera associé à une classe Java

    C'est à dire :

    1. Tu dois déclarer une méthode native, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public native void method(String param);
    2. Compiler cette classe puis utiliser l'outils javah du JDK qui te génèrera un fichier *.h avec la signature de la méthode.

    A partir de là tu dois coder cette méthode (qui dans ton cas fera donc appel à ta biliothèque), afin de générer une bibliothèque dynamique (*.dll sous Windows, lib*.so sous Unix/Linux) qui devra être chargé avant l'appel de ta méthode. Pour cela il faut utiliser un bloc static :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class MaClasse {
     
    	static {
    		// code exécuté au chargement de la classe
    		System.loadLibrary("libname");
     
    	}
     
    	public native void method(String param);
    }

    Bref tu te retrouves avec :
    • Une classe Java
    • Une DLL appelé directement par le code Java
    • Ta DLL initiale




    Citation Envoyé par khayyam90
    Y a-t-il d'autres outils plus performants ?
    De veux-tu dire par performance exactement ?
    Je ne pense pas que JNI ait des problèmes de performances particuliers...

    Sinon j'ai entendu parler de SWIG qui permet de "simplifier" l'utilisation de JNI (mais j'ignore comment car je ne l'ai jamais utilisé).


    a++

  4. #4
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    merci pour vos réponses à tous les deux,

    Citation Envoyé par adiGuba
    De veux-tu dire par performance exactement ?
    par performances, j'entends la rapidité d'exécution, la mémoire utilisée et aussi pourquoi pas une simplicité d'utilisation.

    Donc si j'ai bien suivi vos 2 interventions, il va me falloir écrire une méthode java native pour chacune des fonctions de ma bibliothèque, histoire de faire le lien entre java et ma dll c++, mais aussi il me faudra écrire des nouvelles versions des fonctions c++ (ou les modifier) pour y rajouter les #include <jni.h> et les paramètres JNIEnv * sur chaque fonction.

  5. #5
    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 khayyam90
    par performances, j'entends la rapidité d'exécution, la mémoire utilisée et aussi pourquoi pas une simplicité d'utilisation.
    Comme je l'ai dit, je ne pense pas qu'il y ait de gros problème de ce coté là. La mémoire utilisé dépend plutôt de ton code natif (et n'est donc pas géré par le Garbage Collector).

    Enfin, comme l'a précisé sinok, il y a des chances pour que l'équivalent en code Java soit plus performant.
    Il faut comprendre par là que JNI sert à appeler du code natif, que ce soit pour ne pas réécrire une bibliothèque ou pour appeler des fonctions spécifiques à un OS.

    Il ne faut pas chercher à utiliser à tout prix à utiliser JNI pour soit-disant améliorer les performances du programme. Si un code Java à des problèmes de performances c'est surement dû à cause de son algorithme

    Citation Envoyé par khayyam90
    Donc si j'ai bien suivi vos 2 interventions, il va me falloir écrire une méthode java native pour chacune des fonctions de ma bibliothèque, histoire de faire le lien entre java et ma dll c++, mais aussi il me faudra écrire des nouvelles versions des fonctions c++ (ou les modifier) pour y rajouter les #include <jni.h> et les paramètres JNIEnv * sur chaque fonction.
    En gros oui. Le lien de sinok est un bon début
    Il faut bien sûr des connaissance en C/C++ (mais je ne pense pas que cela soit un problème )

    a++

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

Discussions similaires

  1. Utiliser une imprimante déportée en Java
    Par gnawa dans le forum Langage
    Réponses: 6
    Dernier message: 23/03/2011, 10h43
  2. Comment utiliser une base DB2 via java?
    Par ::Fistons dans le forum JDBC
    Réponses: 3
    Dernier message: 29/05/2007, 09h24
  3. utiliser une bibliothèque....
    Par miminou dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 18/12/2005, 20h26
  4. Utiliser une bibliothèque statique
    Par djflex68 dans le forum MFC
    Réponses: 6
    Dernier message: 15/08/2005, 19h26
  5. [Windows]utiliser une dll c# en java
    Par dude666 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 01/07/2005, 02h19

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