Java scsi访问

Java scsi访问,java,c,linux,porting,scsi,Java,C,Linux,Porting,Scsi,我想把LinuxC程序移植到Java。此程序控制通过USB电缆连接到电脑的摄像头。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;

我想把LinuxC程序移植到Java。此程序控制通过USB电缆连接到电脑的摄像头。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支持很多POSIXAPI,但ioctl系统调用并不是它的一部分。您需要做的是使用JNI允许Java调用函数,如您在问题中编写的scsi_write。使用更多垫片的额外成本是最小的,因为您正在谈论连接到外部硬件。cmd和buf参数自然映射到Java字节数组,因为Java的数组知道它们的长度,所以您根本不会在Java级别对cmdLen和bufLen参数进行建模。

虽然Java支持很多POSIXAPI,但ioctl系统调用并不是它的一部分。您需要做的是使用JNI允许Java调用函数,如您在问题中编写的scsi_write。使用更多垫片的额外成本是最小的,因为您正在谈论连接到外部硬件。cmd和buf参数自然映射到Java字节数组,因为Java的数组知道它们的长度,所以您根本不会在Java级别对cmdLen和bufLen参数进行建模。

您可能会更幸运地使用基于Java的USB库,比如JSR080 javax.USB的实现。您可以找到参考实现,但只有Linux实现可以进行生产。

您可能会更幸运地使用基于Java的USB库,比如JSR080 javax.USB的实现。您可以找到参考实现,但只有Linux实现可以用于生产。

请尝试IOCTL,您可能需要查看sg3_utils源代码,以了解如何通过IOCTL发送SCSI PDU,它是C代码,但PDU和IOCTL是相同的。那你就知道你可以控制摄像机了

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

您希望在Linux上实现它,还是跨平台实现它?为什么要将其移植到Java?我认为将这种依赖硬件的代码移植到Java没有任何好处。也许您希望将硬件访问封装在C库中,并通过JNI从Java调用它。例如,通过这种方式,您可以用Java编写GUI,并且仍然使用您正在工作且经过测试的C代码进行硬件访问。跨平台当然会更好。@Joachim:他想用Java访问USB设备。为什么这比用Java通常做的任何事情都更依赖硬件,比如访问键盘、鼠标、网络、显示器、打印机等?为什么要移植:如果不可能,我就不移植它。我只是想知道这是否可能。也许其他人已经尝试移植类似的代码,可以给我一些提示。你是想在Linux上实现它,还是想跨平台实现它?为什么要将它移植到Java?我认为将这种依赖硬件的代码移植到Java没有任何好处。也许您希望将硬件访问封装在C库中,并通过JNI从Java调用它。例如,通过这种方式,您可以用Java编写GUI,并且仍然使用您正在工作且经过测试的C代码进行硬件访问。跨平台当然会更好。@Joachim:他想用Java访问USB设备。为什么这比用Java通常做的任何事情都更依赖硬件,比如访问键盘、鼠标、网络、显示器、打印机等?为什么要移植:如果不可能,我就不移植它。我只是想知道这是否可能。也许其他人已经尝试移植类似的代码,可以给我一些提示。不,使用ioctl的东西很少是可移植的。这是一个直接向驱动程序或设备传递信息的系统调用,这永远不会是一个高度可移植的东西。不,使用ioctl的东西很少是可移植的。它是一个系统调用,用于将信息直接传递给驱动程序或设备,这永远不会是一个高度可移植的东西。