Flux rss
Rechercher : dans
Par : Mots clés Nom d'utilisateur
Messages sans réponse

Langage C - jni - tableau à deux dimensions

Sablis, le jeudi 15 février 2007 à 15:11:15 
 Signaler ce message aux modérateurs

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.

Configuration: Windows XP
Internet Explorer 6.0

1

 ght3k7, le vendredi 31 août 2007 à 14:29:37

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

Répondre à ght3k7
C - Problème paramètres tableau 2 dimensions Bonjour, Je cherche désespéremment de l'aide pour afficher un tableau à 2 dimensions ... Je commence par le déclarer ds le main, ensuite je le remplis à partir d'un fichier (fct charge matrice), et je veux l'afficher (fct affiche matrice) Ms je... www.commentcamarche.net/forum/affich-4552508-c-probleme-parametres-tableau-2-dimensions
[C] realloc sur un tableau 2 dimensions (Résolu) Bonjour, J'aurais besoin d'aide parce que je n'arrive pas à reallocer un tableau deux dimensions. Mon tableau a un nombre de ligne qui évolue et trois colonnes. Voila mon code : float **tab; int i; tab = (float**)malloc( 1*sizeof(float*) ); for (i=0 ;... www.commentcamarche.net/forum/affich-4910677-c-realloc-sur-un-tableau-2-dimensions
[Java]Tableau à 2 dimensions Bonjour, je souhaite afficher un tableau à 2 dimensions en Java. Les colonnes indiqueraient les jours et les lignes les heures de mon emploi du temps. J'ai pensé utiliser une Jtable pour faire ça mais je ne peux afficher que les colonnes avec cette... www.commentcamarche.net/forum/affich-2535500-java-tableau-a-2-dimensions
[PHP] tri tableau 2 dimensionsBonjour, j'ai un tableau de type $tab[0][0] = 23 $tab[0][1] = "toto" $tab[1][0] = 12 $tab[1][1] = "titi" $tab[2][0] = 10 $tab[2][1] = "tutu" Je voudrais trier mon tableau de facon a avoir: $tab[0][0] = 10 $tab[0][1] = "tutu" $tab[1][0] = 12 $tab[1][1]... www.commentcamarche.net/forum/affich-1110847-php-tri-tableau-2-dimensions
Tableaux a 2 dimensions en JAVABonjour,je souhaiterais maintenant utiliser un tableau a 2 dimensions J'ai une variable RecupClient="1:Dupont:Jean:32:Paris:67956:123443#4:Legrand:Yves:67:Lyon:87568:nuul#" Les : servent a séparer les mots et le # a séparer les lignes. Je souhaiterais... www.commentcamarche.net/forum/affich-6882521-tableaux-a-2-dimensions-en-java
Comment crié un tableau 2 dimension en phpBonjour, pouvez-vous m'aider pr générer aleatoirement les elements d'une matrice carré (10,10) -->afficher le matrice dans un tableau HTML merci d'avant www.commentcamarche.net/forum/affich-3875518-comment-crie-un-tableau-2-dimension-en-php
Langage C - Les types de donnéesLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le... www.commentcamarche.net/contents/c/ctype.php3
Les structures en langage CDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de... www.commentcamarche.net/contents/c/cstruct.php3
Langage C - Les chaînes de caractèresQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne... www.commentcamarche.net/contents/c/cstring.php3