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側を探してみると以下APIがあることがわかってきた

 [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か、暇を見て進めます。