elamartiabdelfattah
Messages postés3Date d'inscriptiondimanche 25 février 2007StatutMembreDernière intervention 5 décembre 2008
-
5 déc. 2008 à 13:53
sheorogath
Messages postés2448Date d'inscriptionsamedi 21 février 2004StatutModérateurDernière intervention29 janvier 2010
-
8 déc. 2008 à 21:27
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?
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 */
elamartiabdelfattah
Messages postés3Date d'inscriptiondimanche 25 février 2007StatutMembreDernière intervention 5 décembre 2008 5 déc. 2008 à 20:30
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?
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 5 déc. 2008 à 20:35
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 ..."
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 5 déc. 2008 à 20:50
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 ..."
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 6 déc. 2008 à 12:02
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 ..."