Langage C - jni - tableau à deux dimensions
Sablis
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
ght3k7 -
ght3k7 -
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.
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:
- Langage C - jni - tableau à deux dimensions
- Tableau word - Guide
- Langage ascii - Guide
- Trier un tableau excel - Guide
- Tableau croisé dynamique - Guide
- Imprimer tableau excel sur une page - Guide
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.
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.