我想把一个Linux C程序移植到Java上。此程序控制通过USB电缆连接到PC的摄像机。C代码使用Linux SCSI Generic (sg)。
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);
...
}有没有办法把这个程序移植到Java上?我正在搜索为Java编写的跨平台SCSI库,但没有找到。我也在SCSI/sg上搜索JNI,也没找到。
发布于 2010-12-21 17:21:37
虽然Java支持很多POSIX API,但ioctl系统调用不是它的一部分。您需要做的是使用JNI来允许Java调用一个函数,比如您在问题中编写的scsi_write。考虑到您正在谈论的是与外部硬件的接口,使用更多垫片的额外成本是最小的。cmd和buf参数自然地映射到Java数组(因为Java数组知道它们的长度,所以根本不需要在Java级对cmdLen和bufLen参数建模)。
发布于 2010-12-21 17:34:16
您可能会更幸运地使用基于Java的USB库,比如JSR080 (javax.usb)的实现。您可以找到参考实现here,但只有Linux实现才是一种生产准备。
发布于 2019-04-01 10:10:18
请尝试IOCTL,你可能想看看sg3_utils源代码,以了解如何通过ioctl发送SCSI PDU,它是C代码,但PDU和ioctl是相同的。然后你就知道你可以控制摄像机了。
https://stackoverflow.com/questions/4497711
复制相似问题