質問

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は同じです。そうすれば、カメラを制御できることがわかります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top