NDK ベースのインテル® アーキテクチャー向け Android* アプリケーションの開発と移植
この記事は、インテル® デベロッパー・ゾーンに掲載されている「Creating and Porting NDK based Android* Apps for IA」の日本語参考訳です。
目標
この記事は、インテル® アーキテクチャー (IA) ベースのデバイス向けに NDK ベースの Android* アプリケーションを開発する基本的なプロセスを紹介します。また、別のアーキテクチャー・ベースのデバイス向けに開発した NDK ベースの Android* アプリケーションを IA ベースのデバイスへ移植する方法についても説明します。
目次
- はじめに
- IA ベースのデバイス向けに NDK ベースの Android* アプリを開発する
- x86 NDK ツールセットを使用して既存の NDK アプリケーションを IA ベースのデバイスへ移植する
- まとめ
はじめに
Native Development Kit (NDK) ツールセットを利用して、Android* アプリケーションでネイティブコードを使用することができます。これにより、既存のコードを再利用し、低レベルのハードウェアのコーディング、ネイティブコードでのみ最適な機能あるいは利用可能な機能による差別化が可能です。
この記事は、NDK ベースのインテル® アーキテクチャー向けアプリケーション開発における基本的なプロセスを紹介し、既存の NDK ベースのアプリケーションをインテル® アーキテクチャー・ベースのデバイスへ移植する簡単な例についても説明します。説明では、プロセスを示す簡単なステップ・バイ・ステップのアプリケーション開発シナリオを使用します。
ここでは、Android* SDK、Android* NDK を含む Android* 開発環境がすでにインストールされ、アプリケーションのテスト用に emulator-x86 が設定されていることを前提としています。詳細は、インテルの Web サイトにある Android* コミュニティーのセクションを参照してください。ここではほとんどの手順に Linux* コマンドライン・ツールを使用します。
IA ベースのデバイス向けに NDK ベースの Android* アプリを開発する
C とアセンブリー言語で記述された CPUID を解析する既存のコードを例に説明します (CPUID については、http://en.wikipedia.org/wiki/CPUID* (英語) を参照してください)。以下は、その既存の C コード cpuid.c (デモ用のサンプル) です。
Android* アプリケーションから cpuid_parse を呼び出し (cpuid_parse 関数にはあらかじめバッファーが割り当てられると仮定)、その出力内容をアプリケーションで表示してみましょう。
次の手順に従って、Android* アプリケーションを作成し既存のネイティブコードを使用します。
a. デフォルトの Android* プロジェクトを作成する
Android* SDK には、典型的な hello world アプリケーション用にデフォルトのプロジェクト構造を生成するコマンドライン・ツールがあります。ここでは、最初にデフォルトのプロジェクトを作成し、Java* ソースを編集して JNI 呼び出しとネイティブコードを追加します。
上記のスクリーンショットのように、まず labs/lab2 というディレクトリーを作成し、“android” コマンドライン・ツールを使ってデフォルトのプロジェクトを生成します。API レベルは android-15、アプリケーション名は “CPUIdApp”、パッケージ名は com.example.cpuid にします。
次に、“ant” コマンドライン・ツールを使ってプロジェクトをデバッグモードでビルドし、“adb” でインストールします (エミュレーターまたはターゲット上にすでに存在する場合は再インストールします)。ここでは、すでにエミュレーターまたはデバイスがアタッチされており、それが “adb devices” コマンドの出力でリストされる唯一のデバイスであると仮定します。
以下は、ここまでの手順を実行した後の Android* ICS x86 エミュレーターのスクリーンショットです。
アプリケーションをクリックすると、アプリケーションのデフォルトの hello world が表示されます。次に、ネイティブコードを使用するようにアプリケーションを変更します。
b. Java* ソースからネイティブコードを呼び出す
デフォルトの Android* プロジェクトは、hello world プロジェクトに対して、指定されたパッケージ名 (例えば com.example.cpuid) を持つ Java* ソースを生成します。次のスクリーンショットは、main Java* ソースファイル用に生成されたソースコードです。
この Java* ソースコードでネイティブ C/C++ コードを使用するには、最初に JNI 呼び出しを宣言して、ネイティブ・ライブラリーをロードする必要があります (スクリーンショットの黄色のボックス部分)。
宣言文から分かるように、ネイティブ呼び出しは Java* 文字列を返します。この文字列は、サンプル Java* ソースのどこでも使用できます。また、スクリーンショットから、ネイティブ呼び出しで取得した文字列を表示するように TextView を変更していることも分かります (赤色のボックス部分)。
これは、Android* アプリケーションの Java* ソースで JNI ネイティブ呼び出しを宣言して使用する簡単なケースです。次に、“javah” ツールを使ってネイティブコード用の JNI ヘッダースタブを生成し、JNI ネイティブヘッダーに適合するようにネイティブコードを追加/変更します。
c. “javah” を使用してネイティブコード用の JNI ヘッダースタブを生成する
ここでは、JNI 呼び出し要件に適合するようにネイティブコードを変更します。“javah” は、Java* ソースファイルに応じて、適切な JNI ヘッダースタブを自動生成します。このヘッダーの生成には、コンパイル済みの Java* クラスファイルが必要です。次のスクリーンショットに示すように、Java* クラスファイルは “ant debug” を使って簡単に生成できます。
上記のスクリーンショットに示すように、”javah” を使って JNI ヘッダーを生成します (2 つ目の黄色のボックス部分)。このコマンドを実行すると、“jni” ディレクトリーと Java* クラスに基づいてヘッダースタブが生成されます。次のスクリーンショットは、生成された JNI ネイティブ・ヘッダー・スタブです。
生成されたヘッダーに対応する C ソースファイル (“com_example_cpuid_CPUIdApp.c”) を作成します。以下にソースを示します。
ネイティブコード cpuid_parse を呼び出し、パースされたバッファーを JNI 文字列として返します。これで、x86 NDK ツールセットを使用してネイティブコードをコンパイルする準備ができました。
d. NDK を使用して IA 向けネイティブコードをビルドする
Android* NDK ツールセットを使用するビルドシステムでネイティブコードをコンパイルするには、プロジェクト の “jni” フォルダーに Android* 専用のカスタム・メイクファイル “Android.mk” が必要です。Android.mk では、コンパイルするすべての C/C++ ソースファイル、ヘッダー、ビルドタイプ (例: shared_library) を指定します。
以下は、サンプルプロジェクトの Android* メイクファイル (“jni/Android.mk”) に含まれるネイティブコードのリストです。
この簡単なサンプルでは、2 つの C ソースファイルと、ビルドタイプとして共有ライブラリーが指定されています。
これで、“ndk-build APP_ABI=x86” を実行してネイティブコードをビルドし、共有ライブラリーを生成できます。Android* ビルドシステムには、別のメイクファイル “Application.mk” もあります。このファイルでほかのオプションを設定できます。例えば、Application.mk ファイルでサポートされるすべての ABI を指定し、ndk-build ですべてのアーキテクチャーを対象とするネイティブ共有ライブラリーを生成できます。
上記のスクリーンショットは、x86 向けネイティブコードのコンパイルが正常に実行され、共有ライブラリーが生成およびインストールされたことを示しています。これで、Android* アプリケーションをリビルドし、x86 エミュレーターまたはターゲットデバイス上でインストール/実行する準備ができました。
e. IA 向け Android* NDK アプリケーションをリビルド、インストール、実行する
“ant debug clean” コマンドで古いビルドファイルを消去し、“ant debug” コマンドで Android* プロジェクトのリビルドを開始できます。以下のスクリーンショットに示すように、ターゲットデバイスまたは x86 エミュレーター上でアプリケーションを再インストールするには、“adb” コマンドを使用します。
以下のスクリーンショットは、x86 エミュレーターに表示されたアプリケーション・アイコン (上) と、エミュレーター上でアプリケーションを実行した場合の結果 (下) です。
これで、NDK ベースの Android* アプリケーションのビルドは完了です。
x86 NDK ツールセットを使用して既存の NDK アプリケーションを IA ベースのデバイスへ移植する
通常、ネイティブコードを使用する Android* アプリケーションは、標準のプロジェクト構造を持ち、ネイティブソースを含む “jni” フォルダーと対応する Android.mk/Application.mk ファイルがあります。前節では、簡単なサンプルのネイティブ・ソースコードと対応する Android.mk ファイルについて説明しました。
Android* NDK ツールセットでは、Application.mk ですべてのターゲット ABI を一度に指定し、すべてのターゲット向けにネイティブ共有ライブラリーを自動生成できます。Android* ビルドシステムは、自動的に APK 内の全ターゲット・ネイティブ・ライブラリーをパッケージ化し、インストール時に Android* パッケージ・マネージャーが、ターゲット・アーキテクチャーに応じて適切なネイティブ・ライブラリーのみインストールします。
“ndk-build” を呼び出すか、Application.mk で指定することができます。
APP_ABI := all または APP_ABI := armeabi armeabi-v7a x86 |
詳細は、https://developer.android.com/ndk/index.html (英語) を参照してください。
ネイティブコードを使用する既存の Android* アプリケーションを IA ベースのデバイスへ移植する場合、アプリケーションでアーキテクチャー固有のアセンブリー言語や構造を使用していない限り、前述の簡単なプロセスによって IA をサポートできます。しかし、場合によっては、メモリーのアライメントやプラットフォーム固有の命令の使用法など、いくつかの問題が存在する可能性があります。詳細は、
http://software.intel.com/en-us/articles/ndk-android-application-porting-methodologies (英語) を参照してください。
まとめ
この記事では、NDK ベースのインテル® アーキテクチャー向け Android* アプリケーションの開発と移植について説明しました。NDK ベースの IA 向けアプリケーションの開発プロセスをステップ・バイ・ステップで示し、NDK ツールセットを利用して既存の NDK ベースの Android* アプリケーションを IA 向けに移植する簡単な方法を紹介しました。
著作権と商標について
本資料に掲載されている情報は、インテル製品の概要説明を目的としたものです。本資料は、明示されているか否かにかかわらず、また禁反言によるとよらずにかかわらず、いかなる知的財産権のライセンスを許諾するものではありません。製品に付属の売買契約書『Intel’s Terms and Conditions of Sale』に規定されている場合を除き、インテルはいかなる責任を負うものではなく、またインテル製品の販売や使用に関する明示または黙示の保証 (特定目的への適合性、商品適格性、あらゆる特許権、著作権、その他知的財産権の非侵害性への保証を含む) に関してもいかなる責任も負いません。
「ミッション・クリティカルなアプリケーション」とは、インテル製品がその欠陥や故障によって、直接的または間接的に人身傷害や死亡事故が発生するようなアプリケーションを指します。そのようなミッション・クリティカルなアプリケーションのためにインテル製品を購入または使用する場合は、直接的か間接的かにかかわらず、あるいはインテル製品やそのいかなる部分の設計、製造、警告にインテルまたは委託業者の過失があったかどうかにかかわらず、製造物責任、人身傷害や死亡の請求を起因とするすべての賠償請求費用、損害、費用、合理的な弁護士費用をすべて補償し、インテルおよびその子会社、委託業者および関連会社、およびそれらの役員、経営幹部、従業員に何らの損害も与えないことに同意するものとします。
インテル製品は、予告なく仕様や説明が変更される場合があります。機能または命令の一覧で「留保」または「未定義」と記されているものがありますが、その「機能が存在しない」あるいは「性質が留保付である」という状態を設計の前提にしないでください。これらの項目は、インテルが将来のために留保しているものです。インテルが将来これらの項目を定義したことにより、衝突が生じたり互換性が失われたりしても、インテルは一切責任を負いません。この情報は予告なく変更されることがあります。この情報だけに基づいて設計を最終的なものとしないでください。
本資料で説明されている製品には、エラッタと呼ばれる設計上の不具合が含まれている可能性があり、公表されている仕様とは異なる動作をする場合があります。現在確認済みのエラッタについては、インテルまでお問い合わせください。
最新の仕様をご希望の場合や製品をご注文の場合は、お近くのインテルの営業所または販売代理店にお問い合わせください。
本資料で紹介されている資料番号付きのドキュメントや、インテルのその他の資料を入手するには、1-800-548-4725 (アメリカ合衆国) までご連絡いただくか、
http://www.intel.com/design/literature.htm (英語) を参照してください。
Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
© 2012 Intel Corporation. 無断での引用、転載を禁じます。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。