連載
» 2009年08月31日 00時00分 UPDATE

Androidがもたらす組み込み開発の新たな可能性(2):ネイティブコードとの連携によるAndroidの機能拡張 (1/3)

組み込み機器に「Android」を適用する場合、ネイティブコードとの連携は欠かせない。「Android NDK」について解説する

[藤田 幸治 株式会社富士通ソフトウェアテクノロジーズ,@IT MONOist]

 前回お届けした「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)。


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)。

JNIの仕組み 図1 JNIの仕組み

 「Android 1.5 NDK」サンプルアプリケーションを例に、JavaソースコードとC-Nativeソースコードとの関係を以下に記す(図2)。

JavaとC-Nativeとの関係 図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のインターフェイスを利用する場合は、独自に実装する必要がある。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.