USBデバイスに接続する必要があるAndroidアプリケーションを開発しています。
私はWindowsで同様のアプリケーションを開発し、cで書かれたドライバーを持っています。
Androidアプリケーション用のUSBドライバーを開発したいと思います。Android用のUSBドライバーを開発するために何が必要か知りたいです。
また
ndkを使用してcで記述されたコードを再利用できますか?
ありがとう、
まず、Android は実際には単なる Linux であるため、「Android アプリケーション用の USB ドライバーを作成する」ことについて話している場合は、「特定のデバイス用の Linux USB ドライバーを作成する」と言うべきです。
次に、何らかの方法でデバイスにアクセスする必要があります。Linux 用の USB ドライバーを作成したときに得られるものは、おそらく /dev/ 内のファイル ノードです。Android が適切な Java API を提供していない非標準の USB デバイス (マウス/ジョイスティック/大容量ストレージなど) 用のドライバーを作成したいと思いますか? その場合、ネイティブ ライブラリを作成し (おそらく既に持っている C コードに基づいて)、NDK でコンパイルする必要があります。そこから取得する .so ファイルは、Android アプリケーションにパッケージ化することができ、それを使用して USB デバイスと通信できます。
要約すると:
usb デバイス ドライバー -> カーネル モジュールを作成するか、Linux カーネルにドライバーを埋め込みます。これは、Linux の USB ドライバー プログラミングに関するもので、Web で十分なガイドを見つけることができるはずです。Windows USB ドライバーを実際に作成した場合は、C コードの一部を再利用できるはずです。
デバイスにアクセスするためのネイティブ ラッパー ライブラリ (Windows 用語に慣れている場合は .so ファイル、または .dll) -> 適切なデバイス ノードを開き、デバイスから正しく読み書きする NDK プロジェクトを作成します。
Android アプリ -> .so ファイルをインクルードし、jni を介してそのネイティブ (c) メソッドにアクセスします。javah や swig などのツールを使用して、ライブラリのヘッダー ファイルから jni コードを生成できる場合があります。
前の回答は、デバイスへのルートアクセス権があり、大量展開には適していないことを前提としています。apiバージョン12以降、androidは、低レベルの制御チャネルとusb要求バッファーを使用して特定のデバイスと対話できるusbインターフェースを提供しています。
サポートされているデバイスには2つのタイプがありますusbホストデバイスusb(android)アクセサリデバイス
ホストモードは通常、タブレットでのみ適切にサポートされ、受話器はそれをサポートできますが、ホストモードを維持する能力は低く、質問のデバイスの電圧要求に大きく依存します。
アクセサリモードは、USB標準を拡張して、アクセサリを「Android」アクセサリとして識別する追加の交換を追加するため、奇妙です。
上記のモードを使用できる場合は、インストール先のすべてのデバイスを完全に制御できない限り、低レベルのcドライバーを使用するよりもはるかに優れたオプションです。
これらは両方ともJavaAPIであり、GoogleAndroidドキュメントサイトのusbに記載されています。