题
我想将Linux C程序移植到Java。该程序控制使用USB电缆连接到PC的相机。 C代码使用Linux SCSI通用(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,也没有运气。
解决方案
虽然Java支持很多Posix API,但 ioctl
系统呼叫不是其所作所为的一部分。您需要做的是使用JNI允许Java调用一个函数,例如 scsi_write
您在问题中写道。鉴于您正在谈论与外部硬件接口的额外成本,因此使用更多垫片的成本很小。这 cmd
和 buf
参数自然映射到Java字节数组(并且由于Java的数组知道它们的长度,因此您不会建模 cmdLen
和 bufLen
完全在Java级别的论点)。
其他提示
您可能会使用基于Java的USB库,例如JSR080(Javax.usb)的实现。您可以找到参考实现 这里, ,但只有Linux实施才准备好生产。
请尝试IOCTL,您可能想查看SG3_UTILS源代码,以了解如何通过IOCTL发送SCSI PDU,这是C代码,但是PDU和IOCTL是相同的。然后,您知道可以控制相机。
不隶属于 StackOverflow