Parcourir un tableau d'objets verticalement

Signaler
Messages postés
3
Date d'inscription
dimanche 25 février 2007
Statut
Membre
Dernière intervention
5 décembre 2008
-
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
-
Bonjour ,

Je travaille d'une application de bourse qui utilise l'api JNI pour communniquer entre mes classes Java et mes methodes C.Et je voudrais parcourir mon tableaux de double en 2 dimensions ( consideré en jni comme tableau d'objets) verticallement ,mais je n'arrive pas il me donne comme resultat des chiffres bizzare( des zeros ou bien des chiffres trop grands).est ce que vous pouvez m'aider?

Voici le code de ma methode C

Code :
#include <stdio.h>
#include <stdlib.h>
#include "JniNative.h"

JNIEXPORT jobjectArray JNICALL Java_portefeuille_JniTabVariation_JniTab
(JNIEnv *env, jclass cls, jobjectArray tab ){
int i,j;

int len1 = (*env)->GetArrayLength(env, tab);
jdoubleArray colone = (*env)->GetObjectArrayElement(env,tab, 0);
int len3 = (*env)->GetArrayLength(env,colone);
printf("%i \n",len1);
printf("%i \n",len3);
for (j=0; jGetObjectArrayElement(env,tab, j);
int lenn3 = (*env)->GetArrayLength(env,colone);
*/

/*
jdouble *element = (*env)->GetDoubleArrayElements(env,colone, 0);
*/

/*
printf("%f \n",element[j]);
*/
for(i=0; iGetObjectArrayElement(env,tab,i);
jdouble *element = (*env)->GetDoubleArrayElements(env,colonne, 0);
printf("%f \n",element[len1]);
//printf("%i %i \n ",j,i);
}

}
return tab;

}

Le contenu du tableau a parcourir:


Citation:
+---------------+-------------------+
| action_france | obligation_france |
+---------------+-------------------+
| 100.00 | 100.00 |
| 99.10 | 99.10 |
| 107.75 | 107.75 |
| 111.37 | 111.37 |
| 116.75 | 116.75 |
| 118.43 | 118.43 |
+---------------+-------------------+

Merci de votre aide.

P.S. si quelqu'un a une documenntation francophone de jni merci de me donner le lien.

Amicalement</stdlib.h></stdio.h>

10 réponses

Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
96
<stdio.h>
<stdlib.h> Salut,

tu peux re poster le code stp (juste le code mais en entier ce coup-ci, et au pire si la mise en page foire je la referai
</stdlib.h>
</stdio.h>







------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
3
Date d'inscription
dimanche 25 février 2007
Statut
Membre
Dernière intervention
5 décembre 2008

le code est :

#include <stdio.h>
#include <stdlib.h>
#include "JniNative.h"

JNIEXPORT jobjectArray JNICALL Java_portefeuille_JniTabVariation_JniTab
(JNIEnv *env, jclass cls, jobjectArray tab ){
int i,j;

int len1 = (*env)->GetArrayLength(env, tab);
jdoubleArray colone = (*env)->GetObjectArrayElement(env,tab, 0);
int len3 = (*env)->GetArrayLength(env,colone);
printf("%i \n",len1);
printf("%i \n",len3);
for (j=0; jGetObjectArrayElement(env,tab, j);
int lenn3 = (*env)->GetArrayLength(env,colone);
*/

/*
jdouble *element = (*env)->GetDoubleArrayElements(env,colone, 0);
*/

/*
printf("%f \n",element[j]);
*/
for(i=0; iGetObjectArrayElement(env,tab,i);
jdouble *element = (*env)->GetDoubleArrayElements(env,colonne, 0);
printf("%f \n",element[len1]);
//printf("%i %i \n ",j,i);
}

}
return tab;

}
</stdlib.h></stdio.h>
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
96
Salut,

bon vu qu'il y a des morceaux du code qui ne passent pas, peux tu m'envoyer les code vi MP que je puisse le mettre en page ici

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
96
Salut,

ok ok voici pour la mise en page :

#include <stdio.h>

#include <stdlib.h>

#include "JniNative.h"

JNIEXPORT jobjectArray JNICALL Java_portefeuille_JniTabVariation_JniTab (JNIEnv *env, jclass cls, jobjectArray tab ){

    int i,j;

    int len1 = (*env)->GetArrayLength(env, tab);
    jdoubleArray colone = (*env)->GetObjectArrayElement(env,tab, 0);

    int len3 = (*env)->GetArrayLength(env,colone);

    printf("%i \n",len1);

    printf("%i \n",len3);

    for (j=0; j<len3-1; j++) {
        for(i=0; i<len1; i++){

            jdoubleArray colonne = (*env)->GetObjectArrayElement(env,tab,i);

            jdouble *element = (*env)->GetDoubleArrayElements(env,colonne, 0);

            printf("%f \n",element[i]);

            //printf("%i %i \n ",j,i);

        }

    }

    return tab;

}

maintenant voici un code d'exemple (en c++) avec l'affichage d'un tableau à 2 dimensions issue d'un code java et le retourne avec +1 sur les éléments histoire de te montrer comment modifier les valeurs :

le code JAVA :
import java.util.Random;

public class ArraySample {
   
    /** pour l'init du tableau */
    private static final Random RAND = new Random();

   
    /**
     * Affiche un tableau de double via le code C++ et modification (+1) sur les éléments du tableau
     * (toujours depuis le code C++)
     */
    private static native double[][] displayAndUpdateDoubleArray(double[][] array);
   
    public static void main(String... args) {
        // load de la lib
        System.loadLibrary("ArraySample");
        // création du tableau
        double [][] array = new double[5][10];
        // initialisation
        for(int i = 0; i < array.length; ++i)
            for(int j = 0; j < array[i].length; ++j)
                array[i][j] = RAND.nextDouble();
        // appel de la méthode native et recupération de son contenu
        array = displayAndUpdateDoubleArray(array);
        // affichage en java
        displayDoubleArray(array);
    }
   
    private static void displayDoubleArray(double[][] array) {
        //pour marquer avec le print natif
        System.out.println();
        for (int i=0; i
/* Header for class ArraySample */

#ifndef _Included_ArraySample
#define _Included_ArraySample
#ifdef __cplusplus
extern "C" {
#endif
/* Inaccessible static: RAND */
/*
 * Class:     ArraySample
 * Method:    displayAndUpdateDoubleArray
 * Signature: ([[D)[[D
 */
JNIEXPORT jobjectArray JNICALL Java_ArraySample_displayAndUpdateDoubleArray
  (JNIEnv *, jclass, jobjectArray);

#ifdef __cplusplus
}
#endif
#endif

le fichier C++ :
#include
#include "ArraySample.h"

using namespace std;
/*
 * Class:     ArraySample
 * Method:    displayAndUpdateDoubleArray
 * Signature: ([[D)[[D
 */
JNIEXPORT jobjectArray JNICALL Java_ArraySample_displayAndUpdateDoubleArray
  (JNIEnv *env, jclass cls, jobjectArray java_array) {
   
    size_t dim1Len = env->GetArrayLength(java_array);
    cout << "dim1Len : " << dim1Len << endl;
    for(size_t i = 0; i < dim1Len; ++i) {
        jdoubleArray col = (jdoubleArray)env->GetObjectArrayElement(java_array, i);
        size_t dim2Len = env->GetArrayLength(col);
        //ici tu as une perte de précision ce qui est normale vu que la taille d'un double java
        // n'a absolument rien à voir avec un double C/C++
        jdouble *elements = env->GetDoubleArrayElements(col, NULL);
        cout << "dim2Len : " << dim2Len << endl;
        for(size_t j = 0; j < dim2Len; ++j) {
            cout << "java_array[" << i << "][" << j << "] = " << elements[j] << endl;
            // modification de l'element
            elements[j] += 1;
        }
        // set des elements modifié
        env->SetDoubleArrayRegion(col, 0, dim2Len, elements);
    }
    return java_array;
}

le résultat console :
dim1Len : 5
dim2Len : 10
java_array[0][0] = 0.596088
java_array[0][1] = 0.964761
java_array[0][2] = 0.393371
java_array[0][3] = 0.352583
java_array[0][4] = 0.893507
java_array[0][5] = 0.696266
java_array[0][6] = 0.374339
java_array[0][7] = 0.739272
java_array[0][8] = 0.720096
java_array[0][9] = 0.298848
dim2Len : 10
java_array[1][0] = 0.279755
java_array[1][1] = 0.77524
java_array[1][2] = 0.437923
java_array[1][3] = 0.476287
java_array[1][4] = 0.887212
java_array[1][5] = 0.921007
java_array[1][6] = 0.137351
java_array[1][7] = 0.969254
java_array[1][8] = 0.217742
java_array[1][9] = 0.996271
dim2Len : 10
java_array[2][0] = 0.25382
java_array[2][1] = 0.70059
java_array[2][2] = 0.628084
java_array[2][3] = 0.513904
java_array[2][4] = 0.607138
java_array[2][5] = 0.938079
java_array[2][6] = 0.537712
java_array[2][7] = 0.636384
java_array[2][8] = 0.22649
java_array[2][9] = 0.375258
dim2Len : 10
java_array[3][0] = 0.738274
java_array[3][1] = 0.274826
java_array[3][2] = 0.219854
java_array[3][3] = 0.559141
java_array[3][4] = 0.206745
java_array[3][5] = 0.58225
java_array[3][6] = 0.248278
java_array[3][7] = 0.278281
java_array[3][8] = 0.223475
java_array[3][9] = 0.980369
dim2Len : 10
java_array[4][0] = 0.873483
java_array[4][1] = 0.36542
java_array[4][2] = 0.382433
java_array[4][3] = 0.90318
java_array[4][4] = 0.161516
java_array[4][5] = 0.866064
java_array[4][6] = 0.773346
java_array[4][7] = 0.640807
java_array[4][8] = 0.445677
java_array[4][9] = 0.677616

array[0][0] = 1.5960884655922354
array[0][1] = 1.964760993026248
array[0][2] = 1.3933710500801528
array[0][3] = 1.3525825268973168
array[0][4] = 1.893506742483725
array[0][5] = 1.6962659551793315
array[0][6] = 1.3743389737015175
array[0][7] = 1.7392724279978222
array[0][8] = 1.7200959382000625
array[0][9] = 1.2988483113274734
array[1][0] = 1.2797554664446098
array[1][1] = 1.7752399526747928
array[1][2] = 1.4379226494867319
array[1][3] = 1.4762865412246193
array[1][4] = 1.887212401378327
array[1][5] = 1.9210065343227756
array[1][6] = 1.13735131224667
array[1][7] = 1.969253501348046
array[1][8] = 1.2177415812142751
array[1][9] = 1.9962705170622979
array[2][0] = 1.2538202057617054
array[2][1] = 1.7005902554598347
array[2][2] = 1.6280835884342049
array[2][3] = 1.5139040059787003
array[2][4] = 1.6071378682248825
array[2][5] = 1.9380789049538727
array[2][6] = 1.537711744975462
array[2][7] = 1.6363835509796134
array[2][8] = 1.2264900559192737
array[2][9] = 1.3752575297104697
array[3][0] = 1.7382736192497603
array[3][1] = 1.2748264471392254
array[3][2] = 1.2198544176628654
array[3][3] = 1.5591409321966925
array[3][4] = 1.2067451463832626
array[3][5] = 1.5822503016310465
array[3][6] = 1.2482784109162295
array[3][7] = 1.278280826732856
array[3][8] = 1.2234753951457242
array[3][9] = 1.980368625090878
array[4][0] = 1.8734834657492492
array[4][1] = 1.3654198627057228
array[4][2] = 1.382432755839157
array[4][3] = 1.9031803283585194
array[4][4] = 1.1615163934931634
array[4][5] = 1.8660635971052089
array[4][6] = 1.7733461503665349
array[4][7] = 1.6408066953633502
array[4][8] = 1.4456768827135313
array[4][9] = 1.6776156520818515

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
96
pour precision sur les type JNI :
Java Language Type
|Native Type
|Description
|----
boolean

,
jboolean

, unsigned 8 bits
, ----
byte

,
jbyte

, signed 8 bits
, ----
char

,
jchar

, unsigned 16 bits
, ----
short

,
jshort

, signed 16 bits
, ----
int

,
jint

, signed 32 bits
, ----
long

,
jlong

, signed 64 bits
, ----
float

,
jfloat

, 32 bits
, ----
double

,
jdouble

, 64 bits

source :
http://java.sun.com/docs/books/jni/html/types.html

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
3
Date d'inscription
dimanche 25 février 2007
Statut
Membre
Dernière intervention
5 décembre 2008

Merci beaucoup pour ton aide.Mais j'ai toujours la meme resultat c'est qu'il marche toujours quand on veut parcourir le tableau par ligne mais dans le cas inverse ( l'afficher colonne par colonne verticalement) j'ai toujours le meme probleme.

P.S. crois tu que le fait de programmer enn c++ ( au lieu de c ) va resoudre le problem?

Amicalement
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
96
Salut,

1 - envoi moi le code complet de ce qui merde chez toi (bien qsue ton code C est faux) (dans mon exemple je parse col par col)
2 - que tu ecrive en C ou C++ c'est la meme sauf qu'en C++ tu n'as pas besoin de faire : (*env)->Methode(env,...) mais simplement env->Methode(...)

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
96
Salut,

déjà juste pour le détail n'utilise pas :
System.load("E:\\projet_fin_detudes\\PortefeuilleNative\\dist\\JniNative.dll");

mais ce que j'utilise dans mon code d'exemple....
pour le reste je regarde demain, là je dois partir donc pas moyen de verif ton code (envoyé par MP)... mais demain dans la journée je corrige le tout et te mail ici.

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
5350
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
29 juin 2020
96
Salut,

bon j'ai modifié mon code d'exemple pour parcourir le tableau colonne par colonne - je ne change plus le contenu du tableau. :

JNIEXPORT jobjectArray JNICALL Java_ArraySample_displayAndUpdateDoubleArray
  (JNIEnv *env, jclass cls, jobjectArray java_array) {
    jboolean isCopy;
    size_t dim1Len = env->GetArrayLength(java_array);
    size_t j = 0;
    bool exit = false;
    while(!exit) { // pour boucler sur tous les éléments du tableau
        for(size_t i = 0; i < dim1Len; ++i) {
            jdoubleArray col = (jdoubleArray)env->GetObjectArrayElement(java_array, i);
            size_t dim2Len = env->GetArrayLength(col); // defois que la taille de la 2eme dim ne soit pas régulière
            // si la j depasse la taille du tableau on sort
            if(j >= dim2Len) {
                if(i == (dim1Len - 1)) { // si on est à la fin
                    exit = true;
                    break;
                } else // sinon on passe à l'element[i] suivant
                    continue;
            }
            jdouble *elements = env->GetDoubleArrayElements(col, &isCopy);
            cout << "java_array[" << i << "][" << j << "] = " << elements[j] << endl;
            // libération du pointeur
            if(isCopy == JNI_TRUE)
                 env->ReleaseDoubleArrayElements(col, elements, JNI_ABORT);
           
        }
        ++j;
    }
    return java_array;
}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
11
Resolu ou pas ?

les commentaires partout ca nuit a la lisibilite je trouve :p

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"