- - 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がもたらす組み込み開発の新たな可能性」
- Androidでビジネス拡大を狙うミップスの新戦略
- メンターは組み込みソフトにコミットする
- AndroidはGoogleとウインドリバーの合作だった
- 手探りからの脱却!? ESECで見つけたAndroid技術
- Googleも想像しなかった“先を行く”Android展開
- Androidビジネスの足音が聞こえた!!
- OESF、軽量版「Android」への取り組みにも着手
- 組み込みシステムを革新する−Androidイノベーション
- 見えてきた!? ケータイ以外でのAndroidの適用例
- ケータイアプリ事情−iPhoneからAndroidへの移植も
- AndroidはGoogleとウインドリバーの合作だった
- “非ケータイ”で輝くAndroidの秘めたる可能性
組み込み開発フォーラム 新着記事
- フルスクラッチの“Hello World”を動かしてみよう(2011/3/31)
- FlexRayプロトコルの概要(その2)(2011/3/29)
- JASA、東北地域に拠点を置く会員企業を支援(2011/3/25)
- NEC、震災の影響を受けた4拠点の生産再開を発表(2011/3/23)
- 内部ブロック図の基礎と共通要素(2011/3/22)
- インテル、被災地におけるITインフラの復旧を支援(2011/3/22)
- Facts on AUTOSAR/AUTOSAR導入の現実(2011/3/18)
- 計測器・震災被害ホットラインを開設、テクトロニクス(2011/3/18)
- ZMP、地震の揺れを多角的に計測するアプリ無償配布(2011/3/16)
- メンター、3Dテレビ・マルチメディア検証プラットフォーム(2011/3/16)
- 【番外編】タチの良い計測値、悪い計測値とは?(2011/3/15)
- tarファイルシステムをAndroidに組み込む!!(2011/3/10)















