Android NDK (What is the NDK?) 和訳 1

仕事中に和訳したものであるので、公開していませんでしたが
半年ほど経ちますし、他の誰かに役立てればいいなと思って少し公開してみます。


私は英語が得意ではないので、意訳などをしている箇所も多いと思いますので原文も参照しながら
確認してくださることをお勧めします。
ちなみに、これはAndroid NDK, Revision 5 (December 2010)時点の文章です。


原文 : http://developer.android.com/intl/ja/sdk/ndk/overview.html




What is the NDK?
- NDKとは


AndroidNDKは、デベロッパーがネイティブコードを利用したくなったときに
Androidアプリケーションへネイティブコードを利用するコンポーネントを組み込むためのtoolsetです。


Androidアプリケーションは、Dalvik仮想マシンで動作しています。
このNDKを使えば、ネイティブコード用の言語(例えばCやC++)を使った処理をあなたの
アプリケーションへ組み込むことが出来ます。


また、既存のコードの再利用や、様々なケースで処理速度向上のために
有益なクラスをアプリケーションへ提供することが出来ます。


NDKは以下の機能を提供します。
・一組のツールとビルドファイルは、CまたはC++のソースを使ってネイティブコードライブラリを生成します。
Androidバイスで実行できるアプリケーションパッケージファイル(.apk)に対応するネイティブライブラリを埋め込む方法。
・一組のネイティブシステムヘッダとライブラリはAndroid1.5から始まる全てのバージョンでサポートされます。
 Native Activityを使うアプリケーションは、Android2.3以降でのみ実行が可能です。
ドキュメンテーション、サンプル、チュートリアル


最新のNDKでサポートするARMの命令セットは以下になります。

・ARMv5TE (including Thumb-1 instructions)
・ARMv7-A (including Thumb-2 and VFPv3-D16 instructions, with optional support for NEON/VFPv3-D32 instructions)
※将来対応予定のもの
x86 instructions (see CPU-ARCH-ABIS.HTML for more information)

ARMv5TE machine code will run on all ARM-based Android devices. 
ARMv7-A will run only on devices such as the Verizon Droid or Google Nexus One
 that have a compatible CPU. The main difference between the two instruction sets is that
 ARMv7-A supports hardware FPU, Thumb-2, and NEON instructions. 
You can target either or both of the instruction sets   ARMv5TE is the default,
 but switching to ARMv7-A is as easy as adding a single line to the
 application's Application.mk file, without needing to change anything else in the file. 
You can also build for both architectures at the same time and have everything
 stored in the final .apk.
Complete information is provided in the CPU-ARCH-ABIS.HTML in the NDK package.

ARMv5TEの機械語は、全てのARMに基づくAndroidバイスで動作します。
ARMv7-Aは、互換CPUを持っているVerizon DroidまたはGoogle Nexus Oneでのみ動作します。
2つの命令セットの主な違いは、ARMv7-AがサポートするハードウェアFPU、Thumb-2とNEON命令です。


あなたはどちらもターゲットとすることができますが、どちらもARMv5TEがデフォルトになっています。
しかし、ARMv7-Aに変更したい場合は簡単です。 アプリケーションのApplication.mkへ一行追加するだけです。
それ以外に変更が必要なファイルはありません。


あなたは、同時に両方のアーキテクチャのために作ることも可能で、全てを最終的な.apkに保存しておくこともできます。
詳細な情報は、NDKパッケージでCPU-ARCH-ABIS.HTMLで提供されています。

The NDK provides stable headers for libc (the C library), libm (the Math library),
 OpenGL ES (3D graphics library), the JNI interface, and other libraries,
 as listed in the Development Tools section.

開発ツールセクションにリストされて、NDKは安定したヘッダをlibc(Cライブラリ)、libm(Mathライブラリ)、
OpenGL ES(3Dグラフィックスライブラリ)、JNIインタフェースとその他のライブラリへ提供します。




When to Develop in Native Code
- どんなときにネイティブコードを用いて開発するべきか


NDKは、大部分のアプリケーションでは必要ありません。
開発者として、あなたはその利点と欠点とのバランスを取る必要があります。
特に、ネイティブコードを使うことは自動的にパフォーマンスを向上させますが、
往々にしてアプリケーションの複雑化を招きます。
一般に、あなたがC/C++でプログラムを行うことを好むからではなく、それがあなたのアプリケーションにとって
必須であるならば、ネイティブコードを使わなければならないだけです。



NDKの良い使い方は、多くのメモリを割り当てない自己完結型のCPUに負担をかける処理に利用することです。
単に通常C言語で動作するメソッドをコーディングし直すだけではパフォーマンスを大きく増加するだけに終わります。
あなたがネイティブコードで開発しないといけないか調査するとき、あなたの要求する用途について考えて
AndroidフレームワークAPIで実現できないか、確認してください。
NDKは、しかし既存のC/C++コードで書かれた大きな言語資料を再利用するには効果的な方法です。



Androidフレームワークは、ネイティブコードを使うために2つの方法を提供します。

・Write your application using the Android framework and use JNI to access the APIs
 provided by the Android NDK. This technique allows you
 to take advantage of the convenience of the Android framework,
 but still allows you to write native code when necessary. You can install applications
 that use native code through the JNI on devices that run Android 1.5 or later.
・Write a native activity, which allows you to implement the lifecycle callbacks in native code.
 The Android SDK provides the NativeActivity class, which is a convenience class
 that notifies your native code of any activity lifecycle callbacks
 (onCreate(), onPause(), onResume(), etc).
 You can implement the callbacks in your native code to handle these events when they occur.
 Applications that use native activities must be run on Android 2.3 (API Level 9) or later.
You cannot access features such as Services and Content Providers natively,
 so if you want to use them or any other framework API, you can still write JNI code to do so.

Androidフレームワークを利用しているあなたのアプリケーションでAndroidNDKによって
 提供されるAPIにアクセスするために、JNIを利用します。
 この技術によってAndroidフレームワークを便利に利用することができ、
 しかし必要なときにはネイティブコードで記述することが出来ます。
 あなたは、Android1.5以降のデバイスでJNIを通してネイティブコードを走らせる
 アプリケーションをインストールすることが出来ます。


・Native Activityで記述することで、あなたはライフサイクルのコールバックを
 ネイティブコード内に組み込むことが出来ます。
 Android SDKはNativeActivityクラスを提供します。これはあなたのネイティブコードにあらゆる
 Activityのライフサイクルコールバック(onCreate()、onPause()、onResume()など)を通知する便利なクラスです。
 各イベントが発生するとき、あなたはこれらのイベントを取り扱うために
 ネイティブコードでコールバックを実行することが出来ます。
 Native Activityを使うアプリケーションは、Andorid2.3(API Level9)以降で実行する必要があります。
 ネイティブではServicesとContent Providersのような仕組みにアクセスすることが出来ないので、
 あなたがこの仕組み、または他のフレームワークAPIを使用したいならば、
 そうするためにJNIコードを書くことも出来ます。




Contents of the NDK
- NDKの内容

NDKはAPIドキュメンテーションとあなたがネイティブコードを記述するのを助けるサンプルアプリケーションを含みます。


Development tools
NDKはLinuxOS XWindows(+Cygwin)プラットフォームでネイティブARMバイナリを生成することが
出来るcross-toolchains (コンパイラ、リンカ、その他)を含みます。


それはプラットフォームの後々のリリースにおいてサポートされると保証される安定した
システムヘッダセットをネイティブAPIに提供します

・libc (C library) headers
・libm (math library) headers
・JNI interface headers
・libz (Zlib compression) headers
・liblog (Android logging) header
・OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers
・libjnigraphics (Pixel buffer access) header (for Android 2.2 and above).
・A Minimal set of headers for C++ support
・OpenSL ES native audio libraries
・Android native application APIS

toolchain/pratform/CPU/Application Binary Interfaceの詳細を取り扱う必要も無く、
NDKはあなたのソースを能率的に動作させるビルドシステムを提供します。
あなたは、どのソースを編集するべきか、そして、どのAndroidアプリケーションで
NDKを利用するか述べるために、非常に短いビルドファイルを作成します
ビルドシステムはソースを編集して、あなたのアプリケーションプロジェクトに直接共有ライブラリを置きます。


重要 :
上記のライブラリを除いては、Androidプラットフォームのネイティブシステムライブラリは、
stableされておらず、将来のプラットフォームによっては変わるかもしれません。
あなたのアプリケーションは、このNDKで提供される安定したネイティブシステムライブラリを利用しなければなりません。