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 :

langage C - JNI - tableau à deux dimensions


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Par défaut langage C - JNI - tableau à deux dimensions
    Bonjour,

    J'ai un problème concernant le passage de paramettre ( tableaux à deux dimensions) en utilisant JNI.

    En sortie de ma fonction je fais appelle à un constructeurr java qui reçoit en entrée plusieurs tableaux de bytes à deux dimensions. Or les données reçues sont mal réceptionnées ou mal rangées.

    Comment peut -on passer un tableau de byte à deux dimensions en utilisant JNI?

    Ma fonction C est de la forme:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    JNIEXPORT jobject JNICALL GetAllToken(JNIEnv * env,
    object obj,
    jbyteArray jhsm_Handle,
    jbyteArray jdpx_Handle,
    jobject KParms,
    jshort jappli_count)
    { 
     
      jbyteArray type;
      jbyteArray allserial[8],allauthmode[8],alldata[8];
      jclass    cls, objcls;
     
      jfieldID  objfid;  
     
      jmethodID mid;  
     
      TDigipassBlob DPData[8];
     
      aat_int32 retCode=0,i=0,k=0,l=0;
     
      aat_ascii sw_out_type[8] ,
      sw_out_serial_No[8][23] ,
      sw_out_authmode[8][2] ,
      *adpx_Handle = NULL;
     
      TKernelParms *kerParms = NULL;
     
      THSMContext *phsm_Handle= NULL;
     
     
      for (l=0;l<jappli_count;l++)
      {
        memset(&DPData[l],0, sizeof(TDigipassBlob));
        memset(&sw_out_authmode[l],0, sizeof(sw_out_authmode));
        memset(&sw_out_serial_No[l],0, sizeof(sw_out_serial_No));
      }
     
        memset(&sw_out_type,0, sizeof(sw_out_type));
     
      if (jhsm_Handle)
        phsm_Handle = (THSMContext *) (*env)->GetByteArrayElements (env, jhsm_Handle, 0);
     
      /* first create new jbyteArrays */
     
      for (i=0;i<8;i++)
      {
        allserial[i] = (*env)->NewByteArray (env,22);
        allauthmode[i] = (*env)->NewByteArray (env,2);
        alldata[i] = (*env)->NewByteArray (env, 248);
     
      }
     
      type = (*env)->NewByteArray (env, 5);
     
      objcls = (*env)->GetObjectClass (env, obj);
      objfid = (*env)->GetFieldID (env, objcls, "retCode", "I");
     
     
     
      if (KParms)
        kerParms = getKernelParms (env, KParms);
     
     
      retCode = GetAllToken ((void *)phsm_Handle,
                                    &dpx_Handle,
                                    kerParms,
                                    &jappli_count,
                                    sw_out_serial_No,
                                    sw_out_type,
                                    sw_out_authmode,
                                    DPData);
     
      if (jhsm_Handle)
        (*env)->ReleaseByteArrayElements (env, jhsm_Handle, (jbyte *) phsm_Handle, 0);
     
     
     
     
      cls = (*env)->FindClass (env, "xxxxxxxx");
     
    //  mid  = (*env)->GetMethodID (env, cls, "<init>", "([B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B[B)V");
      mid  = (*env)->GetMethodID (env, cls, "<init>", "([[B[[B[[B[B)V");
     
     
      (*env)->SetIntField (env, obj, objfid, (jint) retCode);
     
     
      if (retCode != 100)
      {
        jmethodID void_mid = (*env)->GetMethodID (env, cls, "<init>", "()V");
        return(*env)->NewObject (env, cls, void_mid);
        }
     
     
      for(k=0;k<jappli_count;k++)
      {
        (*env)->SetByteArrayRegion (env, allserial[k], 0, 22, (jbyte *) sw_out_serial_No[k]);
        (*env)->SetByteArrayRegion (env, allauthmode[k], 0, 2, (jbyte *) sw_out_authmode[k]);
        (*env)->SetByteArrayRegion (env, alldata[k], 0, 248, (jbyte *) &DPData[k]);
     
      }
     
     (*env)->SetByteArrayRegion (env, type, 0, 5, (jbyte *) sw_out_type);
     
     
    /*  return (*env)->NewObject (env, cls, mid,
           allserial[0],allserial[1],allserial[2],allserial[3],allserial[4],allserial[5],allserial[6],allserial[7],
           allauthmode[0],allauthmode[1],allauthmode[2],allauthmode[3],allauthmode[4],allauthmode[5],allauthmode[6],allauthmode[7],
           alldata[0],alldata[1],alldata[2],alldata[3],alldata[4],alldata[5],alldata[6],alldata[7],
           type);*/
     
    return (*env)->NewObject (env, cls, mid, allserial, allauthmode, alldata, type);
     
     
      }
    remarque: si je passe en sortie lignes par lignes ça marche (voir les parties en commentaire)


    Si quelqu'un a déjà rencontré ce genre de problème sa solution est la bien venue.

    Je vous remercie d'avance.

  2. #2
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    je n'ai pas de réponse, mais si tu mettais des balises [CODE] tu aurais surement plus de lecteurs assidus et du coup de réponse ...

    (c'est le bouton # ...)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Par défaut Solution Trouvée !!!
    Finalement j'ai trouvé une solution.
    En fait il faut passer des ObjectsArrays en sortie de ma fonction afin que la longueur de colonne et de ligne soient finalement connu par le constructeur.

    Au final cela donne :

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    JNIEXPORT jobject JNICALL GetAllToken(JNIEnv * env,
    jobject obj,
    jbyteArray ,
    jhsm_Handle,
    jbyteArray ,
    jdpx_Handle,
    KParms,
    jshort jappli_count)
    { 
     
      jbyteArray type;
      jbyteArray allserial[8],allauthmode[8],alldata[8];
      jobjectArray oserial,oauthmode,odata;
     
      jclass    cls, objcls;
      jclass    byteArraysClass ;
     
      jfieldID  objfid;  
     
      jmethodID mid;  
     
      TDigipassBlob DPData[8];
     
      aat_int32 retCode=0,i=0,k=0,l=0;
     
      aat_ascii sw_out_type[8] ,
      sw_out_serial_No[8][23] ,
      sw_out_authmode[8][2] ,
      *adpx_Handle = NULL;
     
      TKernelParms *kerParms = NULL;
     
      THSMContext *phsm_Handle= NULL;
     
     
      /* first create new object Arrays for two-dimensional byte Array*/
     
      byteArraysClass=(*env)->FindClass(env,"[B");
     
      oserial = (*env)->NewObjectArray(env,8, byteArraysClass, NULL);
      oauthmode = (*env)->NewObjectArray(env,8, byteArraysClass, NULL);
      odata = (*env)->NewObjectArray(env,8, byteArraysClass, NULL);
     
     
      for (l=0;l<jappli_count;l++)
      {
        memset(&DPData[l],0, sizeof(TDigipassBlob));
        memset(&sw_out_authmode[l],0, sizeof(sw_out_authmode));
        memset(&sw_out_serial_No[l],0, sizeof(sw_out_serial_No));
      }
     
        memset(&sw_out_type,0, sizeof(sw_out_type));
     
      if (jhsm_Handle)
        phsm_Handle = (THSMContext *) (*env)->GetByteArrayElements (env, jhsm_Handle, 0);
     
      /* first create new jbyteArrays */
     
      for (i=0;i<8;i++)
      {
        allserial[i] = (*env)->NewByteArray (env,22);
        allauthmode[i] = (*env)->NewByteArray (env,2);
        alldata[i] = (*env)->NewByteArray (env, 248);
      }
     
      type = (*env)->NewByteArray (env, 5);
     
      objcls = (*env)->GetObjectClass (env, obj);
      objfid = (*env)->GetFieldID (env, objcls, "retCode", "I");
     
     
     
      if (KParms)
        kerParms = getKernelParms (env, KParms);
     
     
      retCode = GetAllToken ((void *)phsm_Handle,
                                    &dpx_Handle,
                                    kerParms,
                                    &jappli_count,
                                    sw_out_serial_No,
                                    sw_out_type,
                                    sw_out_authmode,
                                    DPData);
     
      if (jhsm_Handle)
        (*env)->ReleaseByteArrayElements (env, jhsm_Handle, (jbyte *) phsm_Handle, 0);
     
     
     
     
      cls = (*env)->FindClass (env, "xxxxxxxx");
     
      mid  = (*env)->GetMethodID (env, cls, "<init>", "([[B[[B[[B[B)V");
     
     
      (*env)->SetIntField (env, obj, objfid, (jint) retCode);
     
     
      if (retCode != 100)
      {
        jmethodID void_mid = (*env)->GetMethodID (env, cls, "<init>", "()V");
        return(*env)->NewObject (env, cls, void_mid);
        }
     
     
      for(k=0;k<8;k++)
      {
        (*env)->SetByteArrayRegion (env, allserial[k], 0, 22, (jbyte *) sw_out_serial_No[k]);
        (*env)->SetObjectArrayElement(env,oserial, k, allserial[k]);
        (*env)->SetByteArrayRegion (env, allauthmode[k], 0, 2, (jbyte *) sw_out_authmode[k]);
        (*env)->SetObjectArrayElement(env,oauthmode, k, allauthmode[k]);
        (*env)->SetByteArrayRegion (env, alldata[k], 0, 248, (jbyte *) &DPData[k]);
        (*env)->SetObjectArrayElement(env,odata, k, alldata[k]);
     
      }
     (*env)->SetByteArrayRegion (env, type, 0, 5, (jbyte *) sw_out_type);
     
     
     
     
    return (*env)->NewObject (env, cls, mid, oserial, oauthmode, odata, type);

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

Discussions similaires

  1. [langage] [debutant] tri tableau deux dimensions
    Par labbyjoel dans le forum Langage
    Réponses: 4
    Dernier message: 07/11/2006, 18h38
  2. Affichage d'un tableau à deux dimensions.
    Par Allan dans le forum C
    Réponses: 3
    Dernier message: 11/12/2005, 18h29
  3. Réponses: 1
    Dernier message: 18/11/2005, 11h38
  4. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 21h38
  5. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 14h50

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