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 :

[JNI] Appel d'une fonction native limité


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Points : 71
    Points
    71
    Par défaut [JNI] Appel d'une fonction native limité
    Bonjour à tous,

    Je viens vous demander un petit coup de main car je ne comprends pas d'où vient mon problème.
    Je remplis un tableau double [200][100] par colonne et aux alentours de la colonne 20 soit après 4000 éléments, le remplissage s'arrête et j'ai des 0.0000 à la place :/
    Merci de m'éclairer sur ce problème !!! (mémoire ???)

    Edit : J'utilise NetBeans 6.9

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Bonjour,

    aurais-tu un petit bout de code simple à nous montrer?

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Peut on voir le bout de code qui effectue ce remplissage?
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Points : 71
    Points
    71
    Par défaut Un morceau de code + un semblant de réponse
    Je remplis mon tableau comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    double [][] mat = new double [200][100];
    for(int i=0;i<200;i++)
    {
      for(int j =0;j<100;j++)
      {
        mat[i][j]=maclassenative.valeur(i,j);
      }
    }
    J'utilise un encapsuleur JNI (écrit en C++) pour toutes les fonctions dans ma classe maclassenative. Il semblerait que le problème vienne de là car lorsque je remplace la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mat[i][j]=maclassenative.valeur(i,j);
    par

    ma matrice se remplit de manière correcte jusqu'au bout.

    Je pense que le problème vient de là, mais je ne comprends pas ce qui peut générer cette limite d'écriture dans mon tableau :/

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ce n'est pas une limite d'écriture dans le tableau.

    C'est un bug dans ta classe native dont tu ne nous as pas montré le code.
    Ceci étant dit, le code n'étant pas en Java, je serais déjà moins apte à trouver l'erreur même si tu l'avais posté.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Points : 71
    Points
    71
    Par défaut [JNI] Appel d'une fonction native limité
    Quelqu'un a une idée d'où pourrait venir le problème ?

    Edit : En particulier comment faire pour que les objets crées par JNI soient collectés par le ramasse-miettes GC de Java ?

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ce serait plus facile de deviner ce qui ne va pas si on ne devait pas d'abord lire la fonction native dans tes pensées.

    Edit : En particulier comment faire pour que les objets crées par JNI soient collectés par le ramasse-miettes GC de Java ?
    Les objets Java créés avec JNI seront collectés comme les autres, en temps et en heure. Attention toutefois, cela inclut les objets eux-mêmes, pas les éventuelles structures utilisées pour les organiser et pour lesquelles on a alloué de la mémoire.
    La mémoire qui a été allouée manuellement, pour les structures de données non-Java, ne sera pas garbage-collectée, et doit donc être libérée manuellement avant de sortir de la fonction native.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Points : 71
    Points
    71
    Par défaut
    Voici le code de la fonction posant problème :

    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
     
    JNIEXPORT jfloat JNICALL Java_appli_InterfacePI_piar_1value
      (JNIEnv *env, jobject obj, jint numpt, jint date)
    {
        /* On crée une variable de stockage pour la dll */
        HINSTANCE PIAPI32;
        /* On charge la dll */
        PIAPI32 = LoadLibrary("piapi32.dll");
        if (PIAPI32 != NULL)
        {
            char *type = new char;
            long int *iStat = new long int;
            long int *mode = new long int;
            float *rval = new float;
            /* On a besoin du type du point pour connaitre la valeur à retourner */
            typedef long int (*_pipt_pointtype)(long int,char&);
            _pipt_pointtype pipt_pointtype;
            pipt_pointtype = (_pipt_pointtype)GetProcAddress(PIAPI32, "pipt_pointtype");
            pipt_pointtype(numpt,*type);
            typedef long int (*_piar_value)(long int,long int&,long int,float&,long int&);
            _piar_value piar_value;
            #define ARCVALUEBEFORE  1
            *mode=ARCVALUEBEFORE;
            /* On interface la fonction C++ avec la fonction de la dll */
            piar_value = (_piar_value)GetProcAddress(PIAPI32, "piar_value");
            /* On applique la fonction */
            piar_value(numpt,date,*mode,*rval,*iStat);
            /* On libère la dll */
            FreeLibrary(PIAPI32);
            /* On retourne la valeur courante du point suivant son type */
            delete mode;
            if (*type=='R')
            {
                return *rval;
            }
            else if (*type=='D')
            {
                /* On convertit l'entier en float */
                return static_cast<float>(*iStat);
            }
        }
    }
    Donc j'ai plusieurs questions mais relevant du C++ du coup !
    Comment libérer mes fonctions piar_value et pipt_pointtype ?
    Comment toujours allouer le même espace mémoire pour mes variables internes ?

  9. #9
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    Il serait peut être mieux de clore ce topique et d'en rouvrir un en section C++ non ?

    Car la du coup, seul les personnes faisant du JAVA vont voir ton topique traitant de C++, donc à moins de tomber sur des personnes maîtrisant les 2, tu risque de ne pas avoir beaucoup de réponses...
    C'est en aidant les autres qu'on en apprend beaucoup soi-même

Discussions similaires

  1. appel d'une fonction à partir d'un popup
    Par villeneuvejsp dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/12/2004, 17h00
  2. Appel d'une fonction
    Par georgeabitbol dans le forum ASP
    Réponses: 4
    Dernier message: 08/07/2004, 14h29
  3. Réponses: 4
    Dernier message: 02/06/2004, 16h35
  4. Appel d'une fonction
    Par jfphan dans le forum ASP
    Réponses: 4
    Dernier message: 14/04/2004, 15h06
  5. A la recherche de l'appel d'une fonction...
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 24/09/2003, 12h34

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