- - PR -
前回お届けした「Androidが組み込みで注目される3つの理由」では、携帯電話向けのソフトウェア・プラットフォームとして提供されている「Android」が、携帯電話以外の組み込みデバイス・プラットフォームとして注目されている理由について触れた。
しかし、もともと携帯電話向けに作られたAndroidを、そのまま携帯電話以外の組み込みデバイスに適用することは難しい。さまざまな用途や周辺機器が考えられる組み込みデバイスにAndroidを適用するには、“Androidを拡張”する必要がある。
一口に「Androidの拡張」といっても、「DalvikVM」上で動作するAndroidアプリケーションだけで実現できるものではなく、Linux上の専用ドライバやライブラリ、デーモンとAndroidアプリケーションがデータをやりとりし、処理をLinuxとAndroidアプリケーションとで分担し合う必要がある。
そこで今回は、ネイティブコードとの連携をサポートしている「Android NDK(Android Native Development Kit)」に含まれるサンプルアプリケーションを使って、Androidにネイティブコードを実装し、「JNI(Java Native Interface)(注1)」によるAndroidの拡張方法について紹介する。
| 注1:JNIとは、JavaのプログラムからC/C++言語などで開発されたネイティブコードのプログラムを利用するためのAPI(Application Program Interface)。 |

| 関連リンク: | |
| @IT−「Java Solution」フォーラム http://www.atmarkit.co.jp/fjava/ |
|
Androidを組み込みデバイスに適用する際に求められるもの
はじめに、Androidを携帯電話以外の組み込みデバイスに適用する際に求められる要件を整理してみよう。
1.機器固有機能の実装
前述のとおり、携帯電話以外の組み込みデバイスにAndroidを適用する場合、さまざまな周辺機器との連携、つまり、組み込みデバイスごとの固有機能を実装する必要がある。これを実現するには、Linux側に固有のドライバが必要となり、かつAndroidアプリケーションとのデータのやりとりや処理の分担などを行う必要がある。なお、ここでいうLinuxのドライバは当然、Javaによる記述ではなく、C/C++で記述されたものを指す。
2.開発期間の短縮と資産の有効活用
Linuxで構成されている組み込みデバイスに、Androidを新たに実装しようとした場合、既存のLinux資産(C/C++で実装されたものが多い)を有効活用し、開発期間を短縮したいという要求が出てくる。しかし、膨大なLinux資産をすべてJavaへ移植するとなると、期間・コストなど非常に多くのリスクを抱えることになる。こうした要求を満たし、かつリスクを回避するには、既存のLinux資産をAndroidのLinux部で動作させて、Androidアプリケーションとうまく連携させる必要がある。
| ただし、Linux環境下で多く利用されているCライブラリ(GNU libc)と、Androidで利用される専用ライブラリ「Bionic libc」とは互換性がないため、ネイティブコードによっては一部移植作業が必要となる場合がある。詳しくは以下のTipsを参照のこと。 |
| Tips:Bionic libcとは? |
Bionic libcとは、Androidの基本部となるLinux部に配置されているCライブラリのこと。Android用にカスタマイズされたライブラリであり、Cライブラリ以外にもAndroid専用のファンクションとして、Androidのシステムプロパティを取得する機能やデバッグ時のログ出力機能などが提供されている。 また、Bionic Libcはパフォーマンスやフットプリントなど、組み込み向けに配慮された形で提供されているため、GNU Libcとの互換性はない。つまり、Android環境で実行されるネイティブコードは、すべてこのBionic Libcでコンパイルする必要がある。 |
3.効率化
Android上で動作するアプリケーションは、通常Javaで記述しなければならないが、画像演算処理のような速度が求められるロジックについては、C/C++で実装した方が望ましい場合がある。そのようなパフォーマンスを必要とする処理などは、C/C++で実装された既存のLinux資産として多く存在する。
| Javaとネイティブコードとの連携に用いられるJNIには、オーバーヘッドが存在するため、なるべくネイティブコードとAndroidアプリケーションとのやりとりはなるべく抑えた方がよい。 |
以上、「機器固有機能の実装」「開発期間の短縮と資産の有効活用」「効率化」の観点から、Androidを携帯電話以外の組み込みデバイスに適用するには、ネイティブコードとの連携が必須であることが分かる。
Androidの拡張−ネイティブコードとの連携とは−
Android上でネイティブコードを利用するには、JNIを用いる必要がある。JNI自身はAndroid固有の仕組みではなく、一般的なJavaの世界で広く利用されている。このJNIを利用することで、Androidアプリケーションでもネイティブコードとの連携を実現できる(図1)。
![]() |
図1 JNIの仕組み |
「Android 1.5 NDK」サンプルアプリケーションを例に、JavaソースコードとC-Nativeソースコードとの関係を以下に記す(図2)。
![]() |
図2 JavaとC-Nativeとの関係 |
Android NDKとは?
Android NDKとは、JNIを実装するために必要なツールの集合体である。Android NDKには、C/C++で記述されたソースコードからAndroid用のネイティブコードライブラリを作成するための環境、ネイティブコードを含むアプリケーションを配布する方法、ネイティブのシステムヘッダ・ライブラリとドキュメント、サンプルコードが含まれている。
前回も紹介したが、Android NDKが提供するライブラリは以下のとおりだ。
- 標準Cライブラリ(libc)
- 標準数値演算ライブラリ(libm)
- JNIインターフェイス
- zLib圧縮ライブラリ(libz)
- Kernelへのlogcatメッセージ送信ライブラリ(liblog)
Android NDKが提供するライブラリは、ARMv5TE(ARMv5 Thumb Enhance)に限定されている。そのため、ほかのCPUでJNIのインターフェイスを利用する場合は、独自に実装する必要がある。
>>開発環境を準備して、Androidの拡張を行う!!(次ページへ)
関連記事 Android
- 組み込みAndroid コーナー
- Androidビジネスの足音が聞こえた!!
- OESF、軽量版「Android」への取り組みにも着手
- 組み込みシステムを革新する−Androidイノベーション
- 連載記事「Androidがもたらす組み込み開発の新たな可能性」
- 見えてきた!? ケータイ以外でのAndroidの適用例
- ケータイアプリ事情−iPhoneからAndroidへの移植も
- AndroidはGoogleとウインドリバーの合作だった
- “非ケータイ”で輝くAndroidの秘めたる可能性
- Androidの組み込み向け拡張プラットフォーム発表(@IT MONOist NEWS)
- ソフトフロント、Android上で双方向VoIP通話に成功(@IT MONOist NEWS)
- Androidにも対応するDLNAワンストップサービス(@IT MONOist NEWS)
- 使って分かったAndroidとiPhoneの違い(@IT NEWS)
- Google Android用携帯アプリ作成のための基礎知識(@IT Javaフォーラム)
- Androidで動く携帯Javaアプリ作成入門(@IT Javaフォーラム)
ホワイトペーパー(TechTargetジャパン)
組み込み開発フォーラム 新着記事
- ブロック定義図の基礎(2010/2/8)
- 微細化を超える革新が見えたアルテラ28nm FPGA(2010/2/5)
- OESFとJASAが提携、Android技術認定制度の構築へ(2010/2/5)
- ないと困る!? ファイルシステムのありがたみ(2010/2/4)
- カーエレの進化を支える組み込みソフトウェア開発(2010/2/2)
- アルテラ、28nm FPGAに向けた最先端技術を発表(2010/2/2)
- 【問題6】 高速化技術「パイプライン制御」について(2010/2/1)
- AndroidのカーネルをLinux以外のOSに置き換える(2010/2/1)
- いま振り返るFPGA普及・発展の歴史(2010/1/27)
- 割り込みテクニックでタイマを使おう(2010/1/26)
- Silverlight for Windows Embeddedの実装方法(2010/1/25)
- 【問題5】 ページング方式の「仮想記憶」について(2010/1/20)













