ShortByReference qui pointe vers un tableau de short ?

Résolu
aurhas Messages postés 16 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 juin 2010 - 27 mai 2010 à 16:41
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.

6 réponses

manlap Messages postés 17 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 28 juin 2010
2 juin 2010 à 14:19
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);
}
}
3
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,

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.
3
manlap Messages postés 17 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 28 juin 2010
31 mai 2010 à 10:54
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+
0
aurhas Messages postés 16 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 juin 2010
31 mai 2010 à 14:35
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
aurhas Messages postés 16 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 juin 2010
1 juin 2010 à 15:14
up svp
0
aurhas Messages postés 16 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 juin 2010
2 juin 2010 à 11:42
s'il vous plait, est ce que quelqu'un sait ??
0
Rejoignez-nous