Java scsi访问

标签 java c linux porting scsi

我想将 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,但也不走运。

最佳答案

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

关于Java scsi访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4497711/

相关文章:

java - 如何在运行时编译和部署 java 类?

java - 如何将匿名类重新集成到 ECD 反编译器生成的 Java 代码中?

c - 对 `sin' 的 undefined reference ,即使我使用 <math.h> 和 -lm

linux - bash:查找命令中的复杂测试

java - C 就像在 java 中使用整数一样?

java - 在运行一些 JUnit 测试时如何替换某个类?

c - 表达式必须是指向使用简单指针算法的完整对象类型的指针

c - 有没有办法在内存中逐个字节交换字节数组?

c++ - 如何设置一个 "precise"周期定时器来监视 Linux(C/C++) 中的东西?

c++ - g++ 4.9 sanitizer 错误,在 linux 上使用 cin 解析 bool 值(ubuntu 12.04 64 位)