組み込み機器に「Android」を適用する場合、ネイティブコードとの連携は欠かせない。「Android NDK」について解説する
前回お届けした「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の拡張方法について紹介する。
はじめに、Androidを携帯電話以外の組み込みデバイスに適用する際に求められる要件を整理してみよう。
前述のとおり、携帯電話以外の組み込みデバイスにAndroidを適用する場合、さまざまな周辺機器との連携、つまり、組み込みデバイスごとの固有機能を実装する必要がある。これを実現するには、Linux側に固有のドライバが必要となり、かつAndroidアプリケーションとのデータのやりとりや処理の分担などを行う必要がある。なお、ここでいうLinuxのドライバは当然、Javaによる記述ではなく、C/C++で記述されたものを指す。
Linuxで構成されている組み込みデバイスに、Androidを新たに実装しようとした場合、既存のLinux資産(C/C++で実装されたものが多い)を有効活用し、開発期間を短縮したいという要求が出てくる。しかし、膨大なLinux資産をすべてJavaへ移植するとなると、期間・コストなど非常に多くのリスクを抱えることになる。こうした要求を満たし、かつリスクを回避するには、既存のLinux資産をAndroidのLinux部で動作させて、Androidアプリケーションとうまく連携させる必要がある。
Android上で動作するアプリケーションは、通常Javaで記述しなければならないが、画像演算処理のような速度が求められるロジックについては、C/C++で実装した方が望ましい場合がある。そのようなパフォーマンスを必要とする処理などは、C/C++で実装された既存のLinux資産として多く存在する。
以上、「機器固有機能の実装」「開発期間の短縮と資産の有効活用」「効率化」の観点から、Androidを携帯電話以外の組み込みデバイスに適用するには、ネイティブコードとの連携が必須であることが分かる。
Android上でネイティブコードを利用するには、JNIを用いる必要がある。JNI自身はAndroid固有の仕組みではなく、一般的なJavaの世界で広く利用されている。このJNIを利用することで、Androidアプリケーションでもネイティブコードとの連携を実現できる(図1)。
「Android 1.5 NDK」サンプルアプリケーションを例に、JavaソースコードとC-Nativeソースコードとの関係を以下に記す(図2)。
Android NDKとは、JNIを実装するために必要なツールの集合体である。Android NDKには、C/C++で記述されたソースコードからAndroid用のネイティブコードライブラリを作成するための環境、ネイティブコードを含むアプリケーションを配布する方法、ネイティブのシステムヘッダ・ライブラリとドキュメント、サンプルコードが含まれている。
前回も紹介したが、Android NDKが提供するライブラリは以下のとおりだ。
Android NDKが提供するライブラリは、ARMv5TE(ARMv5 Thumb Enhance)に限定されている。そのため、ほかのCPUでJNIのインターフェイスを利用する場合は、独自に実装する必要がある。
Copyright © ITmedia, Inc. All Rights Reserved.