我想将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 您在问题中写道。鉴于您正在谈论与外部硬件接口的额外成本,因此使用更多垫片的成本很小。这 cmdbuf 参数自然映射到Java字节数组(并且由于Java的数组知道它们的长度,因此您不会建模 cmdLenbufLen 完全在Java级别的论点)。

其他提示

您可能会使用基于Java的USB库,例如JSR080(Javax.usb)的实现。您可以找到参考实现 这里, ,但只有Linux实施才准备好生产。

请尝试IOCTL,您可能想查看SG3_UTILS源代码,以了解如何通过IOCTL发送SCSI PDU,这是C代码,但是PDU和IOCTL是相同的。然后,您知道可以控制相机。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top