Question
Je voudrais au port d'un programme Linux C à Java. Ce programme contrôle une caméra qui est connecté à l'ordinateur avec un câble USB. Le code C utilise Linux SCSI générique (sg).
Exemple de code du programme C:
#include <linux/../scsi/sg.h>
...
static int scsi_write(int sg_fd, uint8_t *cmd, uint32_t cmdLen,
uint8_t *buf, uint32_t bufLen) {
sg_io_hdr_t io;
int r;
memset(&io, 0, sizeof(io));
io.interface_id = 'S';
io.cmd_len = cmdLen;
...
r = ioctl(sg_fd, SG_IO, &io);
...
}
Est-il possible de porter ce programme à Java? Je cherchais une bibliothèque SCSI multi-plateforme écrit pour Java, mais pas trouvé. Je cherchais aussi un JNI sur SCSI / sg, également pas de chance.
La solution
Alors que Java prend en charge beaucoup de l'API Posix, l'appel système ioctl
ne fait pas partie de ce qu'il fait. Qu'est-ce que vous devez faire est d'utiliser JNI pour permettre Java d'appeler une fonction telle que la scsi_write
vous avez écrit dans la question. Le coût supplémentaire de l'utilisation de plus est minime étant donné les cales que vous parlez l'interface avec le matériel externe de toute façon. Les arguments cmd
et buf
carte naturellement tableaux Java d'octets (et étant donné que les tableaux de Java connaissent leur longueur, vous ne serez pas modéliser les arguments cmdLen
et bufLen
au niveau Java du tout).
Autres conseils
S'il vous plaît essayer IOCTL, vous pouvez jeter un oeil à code source de sg3_utils pour apprendre comment envoyer SCSI PDU par ioctl, son code C, mais PDU et ioctl sont les mêmes. Ensuite, vous savez que vous pouvez contrôler la caméra.