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

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

Votre réponse

6 réponses

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

Merci manlap 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de manlap
Meilleure réponse
aurhas 16 Messages postés mardi 3 novembre 2009Date d'inscription 3 juin 2010 Dernière intervention - 3 juin 2010 à 10:11
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.

Merci aurhas 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de aurhas
manlap 17 Messages postés vendredi 4 janvier 2008Date d'inscription 28 juin 2010 Dernière intervention - 31 mai 2010 à 10:54
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
aurhas 16 Messages postés mardi 3 novembre 2009Date d'inscription 3 juin 2010 Dernière intervention - 31 mai 2010 à 14:35
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
aurhas 16 Messages postés mardi 3 novembre 2009Date d'inscription 3 juin 2010 Dernière intervention - 1 juin 2010 à 15:14
0
Merci
up svp
Commenter la réponse de aurhas
aurhas 16 Messages postés mardi 3 novembre 2009Date d'inscription 3 juin 2010 Dernière intervention - 2 juin 2010 à 11:42
0
Merci
s'il vous plait, est ce que quelqu'un sait ??
Commenter la réponse de aurhas

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.