Appel de fonctions d'une DLL par une application Java avec JNA => AU SECOURS SVP

aurhas Messages postés 16 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 juin 2010 - 17 mai 2010 à 14:25
moatezlouati Messages postés 3 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 9 juin 2011 - 9 juin 2011 à 12:02
Bonjour,
j'essaye depuis un moment déjà d'utiliser JNA pour appeler des fonctions d'une librairie mais ce n'est pas très efficace. C'est pour utiliser une DLL qui dialogue avec une puce FTDI qui fait USB-RS232 pour une interface USB-CAN.
J'ai trouvé une application java (jd2xx) qui devrait fonctionner. Le problème que j'ai est que, normalement, il faut ouvrir le port et ensuite on récupère le handle, mais dans mon cas j'ai l'impression que le port n'est ouvert qu'à la fin de mon main (je l'ai pourtant mis au début) et donc le handle est nul et les autres fonctions (auxquelles je passe le handle comme paramètre) ne fonctionnent pas. J'ai essayé de faire des threads mais il y a un problème avec non-static method.... je ne comprends pas bien.
J'aimerais savoir s'il y a un moyen de faire en sorte que rien ne se passe tant que le port n'est pas ouvert et que le handle est nul (le handle n'est jamais passé ou renvoyé comme paramètre (seulement avec env)...)

AU SECOURS SVP


voici en gros le contenu de l'app (je mets ce que je pense être essentiel ou en tout cas pouvant aider à la compréhension) :
public class JD2XX implements Runnable {
public static final int
DEFAULT_RX_TIMEOUT = 300,
DEFAULT_TX_TIMEOUT = 300;
public native int getLibraryVersion();
public native int createDeviceInfoList();
public native void open(int deviceNumber) throws IOException;
static {
System.loadLibrary("jd2xx");
}
public JD2XX() {
}
public void run() {
while (true) {
int et = waitEvent();
if (kill) break;
else dispatchEvent(et);
}
}
public static void main(String[] args) throws IOException {

JD2XX jd = new JD2XX();
int n = jd.createDeviceInfoList();
DeviceInfo di = jd.getDeviceInfoDetail(0);
System.out.println(di.toString());
jd.open(0);
jd.setBaudRate(38400);
jd.setDataCharacteristics(
8, JD2XX.STOP_BITS_1, JD2XX.PARITY_NONE
);
jd.setFlowControl(
JD2XX.FLOW_NONE, 0, 0
);
jd.setTimeouts(1000, 1000);
di = jd.getDeviceInfoDetail(0);
System.out.println(di.toString());

//String msg = "Hello dude. This is the message.";
String msg = "t0A125501\r\0";
//int ret = jd.write(msg.getBytes());
int ret = jd.write(msg.getBytes());
System.out.println(ret + " bytes sent.");
byte[] rd = jd.read(10);
System.out.println(rd);
msg = "F\r";
//int ret = jd.write(msg.getBytes());
ret = jd.write(msg.getBytes());
System.out.println(ret + " bytes sent.");
rd = jd.read(10);
System.out.println(rd);
}



et voici pour le contenu de la DLL concernant la fonction Open
JNIEXPORT void JNICALL
Java_jd2xx_JD2XX_open(JNIEnv *env, jobject obj, jint dn) {
jint hnd = get_handle(env, obj);

if (hnd != (jint)INVALID_HANDLE_VALUE) // previously initialized!
io_exception(env, "device already opened");
else {
FT_HANDLE h;
FT_STATUS st = FT_Open(dn, &h);

if (FT_SUCCESS(st)) set_handle(env, obj, (jint)h);
else io_exception_status(env, st);
}
}


la sortie me fait :
index: 0, flags: 0x49, type: 0x5, id: 0x403ffa8, location: 0x52, serial: LWT16NBU, description: CANUSB, handle: 0x0
index: 0, flags: 0x49, type: 0x5, id: 0x403ffa8, location: 0x52, serial: LWT16NBU, description: CANUSB, handle: 0x0
11 bytes sent.
[B@addbf1
2 bytes sent.
[B@42e816

on voit que les handles sont nuls et les bytes lus ne correspondent à rien, de plus je n'ai pas de signal CAN en sortie (normal vu que le handle est nul...).


Aidez moi svp je ne sais plus quoi faire.
Merci bcp d'avance.

1 réponse

moatezlouati Messages postés 3 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 9 juin 2011
9 juin 2011 à 12:02
Bonjour,
Est-ce que tu as trouvé une solution à ce problème?
Si oui, merci de me la communiquer.
A+
0
Rejoignez-nous