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 :

Problème appel JNI d'une dll via COM


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème appel JNI d'une dll via COM
    Bonjour,

    j'essaie d'appeler une dll depuis du code java:

    Voici le code java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class MS2525bSymbolBuilder 
    {
        static
        {
            System.loadLibrary("JNIRakuInteface");
        }
     
        public static native void createSymbol(String code_p, String filename_p);
     
    }
    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
    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
     
     
    void initializeComAPI()
    {
        if (!initialized)
        {
        	OleInitialize(NULL);
     
            // Create the RSS COM object and retrieve the default interface IID_IRSSComponent
    		hr = CoCreateInstance(__uuidof(RSSCOMObject), NULL, CLSCTX_ALL, IID_IRSSComponent, (void**)&pIRSSComp);
            printf ("hr= %d, pIRSSComp= %d\n", hr, pIRSSComp); 
     
            if (hr != S_OK)
            {
                if (hr == REGDB_E_CLASSNOTREG)
                {
                    printf ("A specified class is not registered in the registration database.\n"); 
                }
     
                else if (hr == CLASS_E_NOAGGREGATION)
                {
                    printf ("This class cannot be created as part of an aggregate.\n"); 
                }
     
                else if (hr == E_NOINTERFACE)
                {
                    printf ("The specified class does not implement the requested interface, or the controlling IUnknown does not expose the requested interface.\n"); 
                }
            }
     
            else
            {
            }
        	// Query for the ConnectionPointContainer 
    		//hr = pIRSSComp->QueryInterface(IID_IConnectionPointContainer,(LPVOID FAR*)&lpCPC);
     
    	    // Find the event and advise	
    		//hr = lpCPC->FindConnectionPoint(DIID__IRSSComponentEvents,&lpCPT);
    		//hr = lpCPT->Advise(&g_RSSEventDispatch,&dwEventCookie);
    		//SafeRelease(lpCPC);
        }
    }
     
    JNIEXPORT void JNICALL Java_commons_symbology2525b_MS2525bSymbolBuilder_createSymbol
    (
        JNIEnv * env_p,
        jclass class_p,
        jstring code_p,
        jstring destFilename_p)
    {
        if (!initialized)
        {
            initializeComAPI();
        }
     
    }

    Mon problème est le suivant:
    Avec les jdk1.5 et 1.6 lorsque je lance le programme java avec l'option -Xmx1024m la methode CoCreateInstance me retourne l'erreur REGDB_E_CLASSNOTREG alors qu'avec la jdk 1.4 cela marche bien.

    Quelqu'un a une idée ?

  2. #2
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par mfabien
    Bonjour,

    j'essaie d'appeler une dll depuis du code java:

    Voici le code java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class MS2525bSymbolBuilder 
    {
        static
        {
            System.loadLibrary("JNIRakuInteface");
        }
     
        public static native void createSymbol(String code_p, String filename_p);
     
    }
    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
    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
     
     
    void initializeComAPI()
    {
        if (!initialized)
        {
        	OleInitialize(NULL);
     
            // Create the RSS COM object and retrieve the default interface IID_IRSSComponent
    		hr = CoCreateInstance(__uuidof(RSSCOMObject), NULL, CLSCTX_ALL, IID_IRSSComponent, (void**)&pIRSSComp);
            printf ("hr= %d, pIRSSComp= %d\n", hr, pIRSSComp); 
     
            if (hr != S_OK)
            {
                if (hr == REGDB_E_CLASSNOTREG)
                {
                    printf ("A specified class is not registered in the registration database.\n"); 
                }
     
                else if (hr == CLASS_E_NOAGGREGATION)
                {
                    printf ("This class cannot be created as part of an aggregate.\n"); 
                }
     
                else if (hr == E_NOINTERFACE)
                {
                    printf ("The specified class does not implement the requested interface, or the controlling IUnknown does not expose the requested interface.\n"); 
                }
            }
     
            else
            {
            }
        	// Query for the ConnectionPointContainer 
    		//hr = pIRSSComp->QueryInterface(IID_IConnectionPointContainer,(LPVOID FAR*)&lpCPC);
     
    	    // Find the event and advise	
    		//hr = lpCPC->FindConnectionPoint(DIID__IRSSComponentEvents,&lpCPT);
    		//hr = lpCPT->Advise(&g_RSSEventDispatch,&dwEventCookie);
    		//SafeRelease(lpCPC);
        }
    }
     
    JNIEXPORT void JNICALL Java_commons_symbology2525b_MS2525bSymbolBuilder_createSymbol
    (
        JNIEnv * env_p,
        jclass class_p,
        jstring code_p,
        jstring destFilename_p)
    {
        if (!initialized)
        {
            initializeComAPI();
        }
     
    }

    Mon problème est le suivant:
    Avec les jdk1.5 et 1.6 lorsque je lance le programme java avec l'option -Xmx1024m la methode CoCreateInstance me retourne l'erreur REGDB_E_CLASSNOTREG alors qu'avec la jdk 1.4 cela marche bien.

    Quelqu'un a une idée ?
    Niveau JNI rien ne me choque et je pense que ce n'est ni un problème C, ni Java, mais COM. -> prog Windows http://www.developpez.net/forums/forumdisplay.php?f=16

    L'option -Xmx1024m va dire à la VM de prendre au max 1Gb de mémoire sur le tas. Ca m'étonne que cela puisse être la cause de ton erreur (cela marche t-il en Java 5 et 6 sans l'option -Xmx (et quelle est est la valeur pas défaut pour le tas de ta VM ?) ?). L'erreur concerne plutôt un problème d'enregistrement d'un composant au niveau de la base de registre (ta dll par exemple, essaie regsvr32 nomdetabiblio.dll).

    A+

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Août 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    La dll a été enregistré avec la commande regserv32.
    Par défaut l'option -Xmx faut 64Mo. Et sans cette option, la creation de l'instance COM fonctionne.

  4. #4
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par mfabien
    La dll a été enregistré avec la commande regserv32.
    Par défaut l'option -Xmx faut 64Mo. Et sans cette option, la creation de l'instance COM fonctionne.
    Bon, dsl, pas d'idée . Ce qui me déroute c'est que cela fonctionne sans expliciter l'option -Xmx et ne fonctionne pas avec. Il est possible que ce soit un pb Java au niveau JRE. Il ne te reste plus qu'à te renseigner sur ta JVM pour savoir si d'autres n'ont pas eu le même souci. Par curiosité, c'est quelle vendeur et quelle version de JVM ?

    Récemment avec du code natif, j'avais une superbe erreur explicite "Can't load IA 32-bit .so on a IA 32-bit platform" avec le JRE de Sun 1.5.0 update 11, tandis qu'avec la même version de JRE en update 6, le message était clair et m'indiquait simplement que la bibliothèque libmachintruc.so n'était pas trouvée.

    A force de virtualiser...

    A+

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/02/2013, 10h57
  2. Problème appel fonction d'une DLL
    Par xEndLe dans le forum Interfaçage autre langage
    Réponses: 1
    Dernier message: 04/05/2012, 17h08
  3. [JNI] accéder à une dll existante
    Par marieR dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 19/05/2006, 11h28
  4. [VB] Problème de chargement d'une DLL
    Par Elijha dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/05/2006, 09h24
  5. Problème de création d'une dll...
    Par adrien954 dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/10/2005, 10h46

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