Posez votre question Signaler

Langage C - jni - tableau à deux dimensions

Sablis 2Messages postés 15 février 2007Date d'inscription - Dernière réponse le 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.
Lire la suite 

Langage C - jni - tableau à deux dimensions »

1 réponses
Réponse
+1
moins plus
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.Configuration: Linux Firefox 2.0.0.6
Ajouter un commentaire
Ce document intitulé « langage C - jni - tableau à deux dimensions » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?