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

C Discussion :

création d'une dll pour une jni -> "undefined reference to"


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 67
    Points : 47
    Points
    47
    Par défaut création d'une dll pour une jni -> "undefined reference to"
    salut,
    je cherche à réaliser une "Java Native Interface". j'ai commencé par faire afficher du texte par la fonction exporté grace à un printf.
    de Java je crée Test.h, ce qui me donnde la signature de la fonction exportée.
    ensuite dans Test.c j'implémente cette fonction comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    JNIEXPORT void JNICALL Java_Test_afficherBonjour(JNIEnv *env, jobject obj)
    {
      printf("\nBonjour");
      return;
    }
    j'ai compilé avec gcc (MinGW)
    ensuite avec le .o et un .def j'ai crée le .dll
    a partir de java j'arrive bien à me servir de cette fonction tout est ok!

    maintenant, passons à mon probleme.
    quand dans la fonction native j'utilise une fonction implementé dans un autre .c, j'arrive à compilé mais lors de la création de la dll, le compilo me donne le message d'erreur undefined reference to "afficher".

    voici mon code...

    Test.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <jni.h>
    #include <stdio.h>
    #include "Test.h"
     
    #include "fonction.h"
     
     
    JNIEXPORT void JNICALL Java_Test_afficherBonjour(JNIEnv *env, jobject obj)
    {
      afficher("Bonjour");
      return;
    }
    fonction.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef _FONCTION_
    #define _FONCTION_
     
    void afficher (char *txt);
     
    #endif
    fonction.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #include "fonction.h"
     
    void afficher (char *txt)
    {
        printf("\n**********************************");
        printf("\n  %s", txt);
        printf("\n**********************************");
    }
    donc je cherche à savoir pourquoi quand je compile gcc arrive à trouver les .h include mais lors de la création de la dll implossible de linker. en effet si j'implemente afficher directement dans Test.c tout marche au poil.

    si jamais vous avez une petite idée de ce que je peux faire n'hésitez pas...

    @+

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par moris113
    donc je cherche à savoir pourquoi quand je compile gcc arrive à trouver les .h include mais lors de la création de la dll implossible de linker. en effet si j'implemente afficher directement dans Test.c tout marche au poil.
    Pourquoi as-tu une phase d'edition de liens lors de la creation de ta .dll? Normalement, tu dois creer tous les objets (donc -c), puis les mettre ensemble dans ta bibliotheque.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 67
    Points : 47
    Points
    47
    Par défaut ayé g trouvé
    salut,
    en fait une fois tous les .c compilés, il faut créer la dll. si une des fonction native fait appel a un autre .h il faut mettre le .c correspondant dans la ligne de commande.

    ce qui nous donne:
    gcc -shared -o -I"chemain des includes particulier, pour moi c'est la JDK" fonction.c Test.c Test.def

    voila et encore merci à tous!

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 67
    Points : 47
    Points
    47
    Par défaut je ne comprend pas ta remarque!
    Citation Envoyé par DaZumba
    ...tu dois creer tous les objets (donc -c), puis les mettre ensemble dans ta bibliotheque.
    pour mettre une fonction dans la bibliotheque, il faut bien utiliser -shared en compilant avec gcc?

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par moris113
    pour mettre une fonction dans la bibliotheque, il faut bien utiliser -shared en compilant avec gcc?
    Entre autres, oui, mais comme tu fais cela objet par objet, aucune erreur d'edition de lien ne peut se produire. C'est pour cela que j'etais surpris.
    Avec gcc, ca se resume a:
    1. Produire les fichiers objets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gcc -fPIC -c -W -Wall toto.c
    gcc -fPIC -c -W -Wall titi.c
    -fPIC produit du "position independent code", ce qui est requis pour les bibliotheques partagees.

    2. Assembler les fichiers objets en une bibliotheque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1.0.1 toto.o titi.o -lc
    ce qui appelle l'editeur de lien pour faire l'assemblage sous le nom libmylib.so.1. Pour le soname, tu n'es pas vraiment oblige mais c'est plus propre (voir ici pour les details).

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/01/2014, 22h43
  2. Réponses: 6
    Dernier message: 10/06/2010, 15h31
  3. Générer une dll pour une application en dotNET
    Par punto dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/04/2008, 16h14
  4. utiliser une dll dans une dll
    Par anthonycosson dans le forum MFC
    Réponses: 2
    Dernier message: 09/05/2006, 21h42
  5. Réponses: 2
    Dernier message: 31/08/2005, 16h12

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