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.