ShortByReference qui pointe vers un tableau de short ? [Résolu]

Messages postés
16
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 juin 2010
- - Dernière réponse : aurhas
Messages postés
16
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 juin 2010
- 3 juin 2010 à 10:11
Bonjour,

en utilisant JNA, je cherche à récupérer des valeurs renvoyées par une fonction de ma DLL.
ma fonction C est :
int read (int ftHandle, char *type, char *module, float *val);

je voudrais que type, module et val pointent vers des tableaux.
sous java j'ai donc écrit :
public int read (int ftHandle, ShortBuffer type, ShortBuffer module, FloatBuffer val);

j'ai également essayé avec :
public int read (int ftHandle, ShortByReference type[], ShortByReference module[], FloatBuffer val);

Les valeurs que je récupère dans val sont cohérentes, par contre, celles de type et module ne correspondent pas.
par exemple lorsque module vaut 1 dans la fonction de ma DLL, je récupère 257 dans java.
pour type = 0 dans la DLL, je récupère 256 dans java. 2(java) pour 1(DLL) et 513(java) pour 2(DLL).
Ma fonction marchait bien lorsque j'utilisait seulement ShortByReference type, donc pas un tableau mais une valeur simple. Mais je voudrais passer des tableaux.
Ce que je ne comprends pas trop, c'est pourquoi ca fonctionne bien avec val mais pas avec les autres.
Comment passe-t-on un pointeur vers un tableau ? dans la DLL, comment modifier une valeur dans un tableau (pour le moment je fais de la même façon pour les 3 paramètres (type, module et val) soit : *(val+nbTrame) = resultat;) ?

Merci d'avance de vos réponses.
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
17
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
28 juin 2010
3
Merci
Hello,

Tu trouveras 1 classe et deux interfaces. Ce code sert à avoir la liste des taches avec JNA et la User32 de windows. Ca pourra peut être t'aider.

package fr.jna.taches;

import com.sun.jna.Pointer;
import com.sun.jna.win32.StdCallLibrary.StdCallCallback;

public interface WNDENUMPROC extends StdCallCallback {
/** Return whether to continue enumeration. */
boolean callback(Pointer hWnd, Pointer lparam);
}


package fr.jna.taches;

import java.nio.CharBuffer;
import java.util.HashMap;
import java.util.Map;

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIFunctionMapper;
import com.sun.jna.win32.W32APITypeMapper;

public interface User32 extends StdCallLibrary {

public static final int WM_GETTEXT = 0xd;
public static final int GW_CHILD = 5;

boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer lparam);
public int GetWindow(Pointer hwnd, int wCmd);
public int SendMessage(Pointer hwnd, int wMsg, int wParam, CharBuffer lParam);
public int GetWindowText(Pointer hwnd, CharBuffer lpString, long cch);
public int GetWindowTextLength(Pointer hwnd);


Map UNICODE_OPTIONS = new HashMap() {
{
put(OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE);
put(OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.UNICODE);
}
};

Map ASCII_OPTIONS = new HashMap() {
{
put(OPTION_TYPE_MAPPER, W32APITypeMapper.ASCII);
put(OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.ASCII);
}
};


Map DEFAULT_OPTIONS = Boolean.getBoolean("w32.ascii") ? ASCII_OPTIONS : UNICODE_OPTIONS;

User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class, DEFAULT_OPTIONS);

}


package fr.jna.taches;

import java.nio.CharBuffer;

import com.sun.jna.Pointer;

public class TestJna {

public static void main(String[] args) {
final User32 user32 = User32.INSTANCE;
user32.EnumWindows(new WNDENUMPROC() {

public boolean callback(Pointer hWnd, Pointer lParam) {

long lResult;

lResult = user32.GetWindow(hWnd, User32.GW_CHILD);


if (lResult != 0) {
lResult = user32.GetWindowTextLength(hWnd);
if (lResult > 0) {
System.out.println("len titre = " + lResult);
int taille = new Long(lResult).intValue() + 1;
CharBuffer toto = CharBuffer.allocate(taille);
lResult = user32.SendMessage(hWnd, User32.WM_GETTEXT, taille, toto);
StringBuffer libelle = new StringBuffer();
for (char carac : toto.array()) {
if (carac >= 32) {
libelle.append(carac);
}
}
System.out.println("toto = '" + libelle + "'");
}
}


return true;
}
}, null);
}
}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 193 internautes nous ont dit merci ce mois-ci

Commenter la réponse de manlap
Messages postés
16
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 juin 2010
3
Merci
Bonjour,

merci pour cet exemple. J'avais essayé de la même façon mais j'ai fini par trouvé le problème.
cela venait de la DLL C : je pensais que cela n'avait aucune incidence d'associer un char en C à un short en java. En fait, en mettant un short en C pour les paramètres module et type, cela fonctionne.

Encore merci.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 193 internautes nous ont dit merci ce mois-ci

Commenter la réponse de aurhas
Messages postés
17
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
28 juin 2010
0
Merci
Bonjour,

Peux-tu montrer le code que tu as dans tes deux méthodes java.

public int read (int ftHandle, ShortBuffer type, ShortBuffer module, FloatBuffer val);


public int read (int ftHandle, ShortByReference type[], ShortByReference module[], FloatBuffer val);


A+
Commenter la réponse de manlap
Messages postés
16
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 juin 2010
0
Merci
Bonjour et merci de vous intéresser à mon problème, que je n'ai pas encore résolu.
voici le code qui utilise public int read (int ftHandle, ShortBuffer type, ShortBuffer module, FloatBuffer val);
int nbTrame;
int ftHandle;
FloatBuffer valR2 = FloatBuffer.allocate(0x1000);
float val2;
ShortBuffer typeR2 = ShortBuffer.allocate(0x1000);
    
short type2;
ShortBuffer moduleR2 = ShortBuffer.allocate(0x1000);
short module2;


synchronized public void run() {
DLL jna = (DLL)Native.loadLibrary("dllIHM3", DLL.class);
nbTrame = jna.read_CAN_buffer (ftHandle, typeR2, moduleR2, valR2);
}

public read(int ftHandle) throws InterruptedException {
        this.ftHandle = ftHandle;
        this.setPriority ( 8 );
        this.start();
        this.join();

        for (int i=0;i<nbTrame;i++) {
            this.type2 = this.typeR2.get(i);
            this.module2 = moduleR2.get(i);
            this.val2 = valR2.get(i);
            MAJ maj = new MAJ(type2, module2, val2);
            maj.join();
        }
    }






voici celui qui utilise public int read (int ftHandle, ShortByReference type[], ShortByReference module[], FloatBuffer val);
int nbTrame;
int ftHandle;
FloatBuffer valR2 = FloatBuffer.allocate(0x1000);
float val2;
ShortByReference[] typeR2 = new ShortByReference[200];    
short type2;
ShortByReference[] moduleR2 = new ShortByReference[200];
short module2;


synchronized public void run() {
DLL jna = (DLL)Native.loadLibrary("dllIHM3", DLL.class);
nbTrame = jna.read_CAN_buffer (ftHandle, typeR2, moduleR2, valR2);
}

public read(int ftHandle) throws InterruptedException {
        this.ftHandle = ftHandle;
        this.setPriority ( 8 );
        this.start();
        this.join();

        for (int i=0;i<nbTrame;i++) {
            this.type2 = this.typeR2[i];
            this.module2 = moduleR2[i];
            this.val2 = valR2.get(i);
            MAJ maj = new MAJ(type2, module2, val2);
            maj.join();
        }
    }



j'arrive donc bien à récupérer les valeurs de val2. au niveau du code C, je fais le même type d'affectation pour les 3 paramètres que je retourne. j'ai même essayé de tout mettre en float mais ca ne fonctionne pas.

merci encore.
Commenter la réponse de aurhas
Messages postés
16
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 juin 2010
0
Merci
up svp
Commenter la réponse de aurhas
Messages postés
16
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 juin 2010
0
Merci
s'il vous plait, est ce que quelqu'un sait ??
Commenter la réponse de aurhas