インテル® IPP を使用して Android* NDK アプリケーションをビルドする
この記事は、インテル® デベロッパー・ゾーンに掲載されている「Building Android* NDK applications with Intel® Integrated Performance Primitives (Intel® IPP)」の日本語参考訳です。
インテル® インテグレーテッド・パフォーマンス・プリミティブ (インテル® IPP) は、画像処理、信号処理、ベクトル演算、小規模な行列演算向けに高度に最適化されたビルディング・ブロック関数群です。いくつかのドメインには、インテル® ストリーミング SIMD 拡張命令 (インテル® SSE) を利用して、インテル® Atom™ プロセッサー向けにチューニングされた関数が含まれています。また、インテル® IPP Linux* 版のスレッド化されていないスタティック ・ライブラリーは Android* OS がサポートされ、Android* アプリケーションで利用できるようになりました。
この記事は、Android* NDK アプリケーションにインテル® IPP 関数を追加する方法を説明します。インテル® IPP は、プロセッサー固有の最適化を提供します。Android* の C/C++ ネイティブコードとリンクできるのはインテル® IPP だけです。ソースコードでインテル® IPP 関数をインクルードし、ビルドコマンドにインテル® IPP ライブラリーを追加します。
インテル® IPP を使用する
1. ソースにインテル® IPP 関数を追加する
- ソースファイルで、インテル® IPP ヘッダーファイル (ipp.h) をインクルードします。
- 最初のインテル® IPP 関数を呼び出す前に ippInit() を呼び出して、CPU ディスパッチを初期化します。インテル® IPP は、プロセッサー機能を検出し、ターゲット・プロセッサー向けに最適化されたコードパスを選択します。
- C/C++ ソースコードでインテル® IPP 関数を呼び出します。
2. インテル® IPP ライブラリーを Android* NDK ビルドファイルに含める
- インテル® IPP ライブラリーとヘッダーファイルをプロジェクト・フォルダーにコピーします。
- アプリケーションに必要なインテル® IPP ライブラリーを確認します。インテル® IPP ライブラリーはドメインごとに分類されています。各ドメインには独自のライブラリーがあり、一部のドメインはほかのドメインに依存しています。すべてのドメイン・ライブラリーと依存ライブラリーをリンク行に含めます。必要なインテル® IPP ライブラリーについては、「Intel IPP Library Dependencies」 (英語) が参考になります。
- Android* ビルド・スクリプト・ファイル “jni/Android.mk” にインテル® IPP を追加します。
各インテル® IPP ライブラリーを事前ビルド済みライブラリー・モジュールとして宣言します。例えば、アプリケーションで 2 つのインテル® IPP ライブラリー “libipps.a” と “libippcore.a” を使用する場合、ファイルに次のコードを追加します。include $(CLEAR_VARS) LOCAL_MODULE := ipps LOCAL_SRC_FILES := ../ipp/lib/ia32/libipps.a include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS) LOCAL_MODULE := ippcore LOCAL_SRC_FILES := ../ipp/lib/ia32/libippcore.a include $(PREBUILT_STATIC_LIBRARY)
インテル® IPP 関数を呼び出すモジュールに、ヘッダーのパスとインテル® IPP ライブラリーを追加します。
include $(CLEAR_VARS) LOCAL_MODULE := IppAdd LOCAL_SRC_FILES := IppAdd.c LOCAL_STATIC_LIBRARIES := ipps ippcore LOCAL_C_INCLUDES := ./ipp/include include $(BUILT_SHARED_LIBRARY)
サンプルコードをビルドする
ここでは、Android* ネイティブコードでインテル® IPP を使用する簡単な例を紹介します。このコードは、インテル® IPP の ippsAdd_32f() 関数を使って 2 つの配列にデータを追加します。
次の操作を行います。
- こちらから サンプルコードをダウンロードして、プロジェクト・フォルダー (例:
) に展開します。 - ソースコードでインテル® IPP の使用法を確認します。”jni/IppAdd.c” ファイルに、インテル® IPP の ippsAdd_32f() 関数を呼び出すネイティブ関数 NativeIppAdd() の実装があります。”src/com/example/testippadd/ArrayAddActivity.java” ファイルは、JNI を介してネイティブ関数 “NativeIppAdd()” を呼び出します。
- “jni/Andriod.mk” ファイルを確認します。このファイルは、必要なインテル® IPP ライブラリーをビルドスクリプトに追加します。サンプルで使用されている ippsAdd_32f() 関数は、インテル® IPP の信号処理ドメインに含まれています。この関数は、”libipps.a” ライブラリーと “libippcore.a” ライブラリーに依存しています。”Andriod.mk” ファイルは、それぞれ対応する 2 つの事前ビルド済みライブラリーを作成します。
サンプルコードは、SDK および NDK コマンドツールあるいは Eclipse* IDE を使ってビルドできます。
コマンドラインからサンプルをビルドする
- インテル® IPP ライブラリーとヘッダーファイルをプロジェクト・フォルダー (例:
/ipp ) にコピーします。 - 次のコマンドで、プロジェクト・ディレクトリーから “ndk-build” スクリプトを実行してネイティブコードをビルドします。
>cd
> /ndk-build - 次のコマンドで、Android* パッケージをビルドして、アプリケーションをインストールします。
>cd
>android update project -p .-s >ant debug >adb install bin/ArrayAddActivity-debug.apk
Eclipse* IDE からサンプルをビルドする
- インテル® IPP ライブラリーとヘッダーファイルをプロジェクト・フォルダー (例:
/ipp ) にコピーします。 - Eclipse* で、[File] > [New] > [Project…] > [Andriod] > [Andriod Project from Existing Code] を選択します。[Root Directory] でサンプルコード・フォルダーを指定し、[Finish] をクリックします。
- 次のコマンドで、プロジェクト・ディレクトリーから ‘ndk-build’ スクリプトを実行してネイティブコードをビルドします。
>cd
> /ndk-build - Eclipse* IDE でアプリケーションをビルドし、.apk ファイルを展開します。
まとめ
この記事では、Android* ネイティブ・アプリケーションでインテル® IPP を使用する方法を紹介しました。インテル® IPP 関数に関する詳細は、インテル® IPP のマニュアル (英語) を参照してください。
添付ファイル | サイズ |
---|---|
ippaddsample.tgz | 2.17KB |
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。