Langage C - jni - tableau à deux dimensions

Fermé
Sablis Messages postés 2 Date d'inscription jeudi 15 février 2007 Statut Membre Dernière intervention 7 février 2008 - 15 févr. 2007 à 15:11
 ght3k7 - 31 août 2007 à 14:29
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:

JNIEXPORT jobject JNICALL GetAllToken(JNIEnv * env,
jobject 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.
A voir également:

1 réponse

Tu es sur qu'on peut passer un tableau de Byte par jni ? moi j'en suis pas sur. si c'est possible, tu peux toujours convertir ton tabeau de 2 dimension (dim1, dim2) en un tableau à 1 dimension (dim1*dim2). C une sorte de passerelle.

personnellement, j'utilise toujours une conersionne de mon tabeau en string (avec sprintf), c plus simple. Et apres avoir recu la chaine de caractère en Java, je la parse encore pour refaire mon tableau ; c'est lourd, mais c éfficace.
1