Kobe GTUG - Code Sprint成果 NDKからUSB Host APIが使えないか模索してみる
※ざっとまとめたので読みづらく、最終結論もでていません。制限時間内の成果なのでご勘弁を。
今日のCodeSprintの成果
Kobe GTUG - Code Sprintのイベント内容についてはこちら
https://groups.google.com/forum/?fromgroups#!topic/kobe-gtug/xioaw3Suj9k
んでボクが設定した課題は「NDKからUSB Host APIを使えるようにする」
現状わかってること
- NDK経由でUSB Host APIが叩ける(Android4.0系をビルドしてできたlibusbhost.soとusbhost.hを使用)
- NDKからUSBを直接オープンしたい->パーミッションではじかれる
てことで他にアクセス方法がないか模索。
改めて、NDKのbulktransferに必要な変数を見てみる。
[NDK] int usb_device_bulk_transfer(struct usb_device *device, int endpoint, void* buffer, int length, unsigned int timeout)
キモは
[NDK]
struct usb_device *device
じゃあ usb_device *deviceはどのように定義するのか?
[NDK]
struct usb_device* device = usb_device_new(deviceNameStr, fd);
- deviceNameStrはデバイス名
- fdはファイルデスクリプタ
このファイルデスクリプタはopenしないとゲットできない。
[Java] UsbDevice Class String getDeviceName() : Returns the name of the device. [Java] UsbDeviceConnection Class int getFileDescriptor() : Returns the native file descriptor for the device, or -1 if the device is not opened. byte[] getRawDescriptors() : Returns the raw USB descriptors for the device.
この3つのAPIでゲットした値をNDKへパスしてやればいけるんじゃね?
つまり
[Java] strDev = UsbDevice.getDeviceName(); desc = UsbDeviceConnection.getFileDescriptor(); or desc = UsbDeviceConnection.getRawDescriptor(); ↓ JNI ↓ [NDK] struct usb_device* device = usb_device_new(strDev, desc); usb_device_bulk_transfer(device,1,readbuf,4096,0);
てなかんじでたたいてやればいけるかも!?
んで、試しにFileDescriptorとRawDescriptorを
Logcatへ出してみる。キャラクタで見てなにかわかるかはわからんけども
コード
[Java] Log.d(TAG,"FileDescriptor : "+connection.getFileDescriptor()); Log.d(TAG,"RawDescriptor : "+connection.getRawDescriptors());
結果
[Logcat] FileDescriptor : 37 RawDescriptor : [B@407a32c8
FileDescriptorは整数
rawDescriptorの方はポインタ?
っていうところまでが今日の成果。
あとは実験してみないとなんともわからん。
肝心のデバイスを会場に持ってくるのを忘れてしまったので
次のCodeSprintか、暇を見て進めます。