1

我想将 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,也没有运气。

4

3 回答 3

3

虽然 Java 支持很多 POSIX API,但ioctl系统调用并不是它所做的一部分。您需要做的是使用 JNI 来允许 Java 调用scsi_write您在问题中编写的函数。考虑到您无论如何都在谈论与外部硬件的接口,因此使用更多垫片的额外成本是最小的。cmdandbuf参数自然地映射到 Java 字节数组(并且由于 Java 的数组知道它们的长度,因此您根本不会在 Java 级别对 and 参数进行建模cmdLen) 。bufLen

于 2010-12-21T09:21:37.477 回答
2

使用基于 Java 的 USB 库可能会更幸运,例如 JSR080 (javax.usb) 的实现。您可以在此处找到参考实现,但只有 Linux 实现可用于生产。

于 2010-12-21T09:34:16.197 回答
0

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

于 2019-04-01T02:10:17.960 回答