質問
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
あなたは質問に書きました。とにかく外部ハードウェアへのインターフェースについて話していることを考えると、より多くのシムを使用する追加コストは最小限です。の cmd
そして buf
引数は Java バイト配列に自然にマップされます (Java の配列はその長さを知っているため、 cmdLen
そして bufLen
Java レベルの引数はまったくありません)。
他のヒント
JSR080(javax.usb)の実装のように、JavaベースのUSBライブラリを使用すると、さらに運が必要です。参照実装を見つけることができます ここ, 、しかし、Linuxの実装のみが生産の一種です。
IOCTLを試してみてください。SG3_UTILSソースコードを見て、IOCTLでSCSI PDUを送信する方法を学習することをお勧めしますが、それはCコードですが、PDUとIOCTLは同じです。そうすれば、カメラを制御できることがわかります。