Bonjour à tous,
voila mon problème : je dois utiliser (avec Java) des fonctions définies dans une dll construite par Labview dont je connais les prototypes. J'utilise donc JNA. Les fonctions de la dll sont utilisables mais je n'arrive pas à récupérer de tableaux.
De façon à ce que les prototypes des fonctions définies dans la dll et dans Java soient compatibles, et que en java tous les arguments sont passés par valeur pour récupérer un argument de sortie je spécifie que les arguments sont passés par référence (DoubleByReference pour un double par exemple).
exemple :
Soit la fonction Sinus définie dans la dll par ce prototype :
void Sinus(double X, double *Sin);
Je définit alors dans mon interface (pour le JNA) l'attribut suivant :
void Sinus(double X, DoubleByReference Sin);
Ceci marche et lors de l'appel à la fonction : je retrouve bien le résultats dans le DoubleByReference Sin.
Mais je ne sais pas comment faire pour passer un tableau par exemple dans une fonction avec pour prototype dans la dll :
SinusCosinus(double X, double SinCos[])
qui est censée renvoyée une tableau de 2 éléments.
Il faut que je trouve le bon mapping pour pouvoir récupérer mon tableau SinCos dans mon programme Java. J'ai essayer un tableau de DoubleByReference[] mais cela fait cracher la dll (trés certainement problème de réservation de la mémoire). Avec un simple DoubleByReference je ne récupère que le premier élément du tableau.
Voici mon code en utilisant un simple DoubleByReference :
interface pour le JNA
1 2 3 4
| public interface CInterface extends StdCallLibrary
{ CInterface INSTANCE = (CInterface) Native.loadLibrary("NameLib", CInterface.class);
public void SinusCosinus(double X, DoubleByReference SinCos);
} |
Dans le programme principal :
1 2 3 4
| CInterface lib = CInterface.INSTANCE;
DoubleByReference SinCos = new DoubleByReference();
lib.SinusCosinus(1, SinCos);
System.out.println(Sin.getValue()); // ne me donne que la première case du tableau |
Avez vous une idée sur comment procéder pour récupérer un tableau en sortie ? Cela peut être au niveau du mapping (type de données non compatibles entre les 2 prototype) ou une façon d'accéder aux cases suivantes à partir du Pointer SinCos.
Merci d'avance.
Partager