Androidアプリでネイティブコードを利用する際に使用するAndroid NDKについて、
http://developer.android.com/sdk/ndk/index.html
の内容を意訳してみました↓
Android NDKはAndroid アプリでネイティブコードで作られたコンポーネントを組み込むためのツールセットです。AndroidはDalvikVM上で動作します。NDKは、アプリをCやC++で記載されたネイティブコードで実装することができます。このため、既存のライブラリを再利用することができ、開発効率の向上にも貢献します。
NDKが提供するものは
- CやC++で記述されたソースコードから、ネイティブコードライブラリを生成するためのビルドファイルとツールセット。
- Androidデバイスにデプロイ可能なAPKファイルに固有のライブラリを埋め込む方法。
- Android1.5以降の全てのプラットフォームでサポートされるネイティブのシステムヘッダとライブラリセット。
- ドキュメント、サンプル、チュートリアル。
現状バージョンの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.TXT for more information)
がサポートされます。
ARMv5TEのマシンコードであれば、ARMベースのAndroidデバイス全般で動作するでしょう。ARMv7-Aの場合は、Verizon DroidやGoogle Nexus Oneなどの互換CPUをもつデバイスで動作するでしょう。
ARMv5TEと ARMv7-Aの大きな違いは、ARMv7-AがハードウェアFPU(浮動小数点処理装置)、Thumb-2(ARMの拡張命令セット)、およびNEON(メディアおよびデジタル信号の処理に向いた64ビットと128ビットの命令セット)をサポートします。
ARMv5TEと ARMv7-Aの両方でもどちらかでも利用することができ、ARMv5TEをデフォルトとして、ARMv7-Aに切り替えるのは簡単で、Application.mkファイルに1行追加するだけです。
また、ARMv5TEと ARMv7-Aの両方のアーキテクチャ用にビルドすることができ、apkファイルに全て格納できます。詳細については、NDKパッケージのドキュメントに含まれるCPU-ARCH-ABIS.TXTを参照。
NDKは、libc(Cライブラリ)、libm(Mathライブラリ)、OpenGL ES(3Dグラフィックスライブラリ)、JNIインタフェース、および他のライブラリ用に安定したヘッダを提供します。
NDKはほとんどのアプリケーションには効果が無いでしょう。開発者としては、利益と欠点のバランスを取る必要があるでしょう。ネイティブコードを使用することは、著しい自動的なパフォーマンス向上がもたらされることは無く、アプリケーションは複雑化します。
NDKの効果的な使用例としては、多くのメモリを割り当てずにCPU負荷の高い操作 する場合や信号処理、物理学のシミュレーションなどです。単純に既存のメソッドをCで最コーディングしただけでは、大きなパフォーマンス改善には至りません。しかし、既存のC/C++コードを再利用する分には、効果的な方法と言えます。
NDKはネイティブコードだけのアプリケーションを開発するためのものではありません。AndroidのプライマリランタイムはDalvikVMのままです。
azuchi Android NDK
AndroidでRESTで通信するモジュールがあったので、試してみました。Jsonのパーサもあるみたいです。
・Restlet Edition for Androidをダウンロード
Restletのダウンロードページから、2.0の「Available editions」→「Edition for Android」の「Zip archive」からダウンロードします。
・使用するjarを取り込む
ダウンロードしたzipを解凍し、「/lib/」ディレクトリ内にある、「org.restlet.jar」と「org.restlet.ext.json.jar」をAndroidプロジェクトのassets内に入れ、プロジェクトを右クリック→プロパティ→ビルドパス→ライブラリ→jarの追加から、上記の2つのjarを取り込む。
・GET通信
import org.restlet.Client;
import org.restlet.Request;
import org.restlet.data.Method;
import org.restlet.data.Protocol;
import org.restlet.ext.json.JsonRepresentation;
import org.restlet.representation.Representation;
(中略)
Client client = new Client(Protocol.HTTP);
String url = "http://www.example.com/";
Request request = new Request(Method.GET, url);
try {
String jsonStr = client.handle(request).getEntity().getText();
JsonRepresentation json = new JsonRepresentation(jsonStr);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
・POST通信
import org.restlet.Client;
import org.restlet.Request;
import org.restlet.data.Form;
import org.restlet.data.Method;
import org.restlet.data.Protocol;
import org.restlet.ext.json.JsonRepresentation;
import org.restlet.representation.Representation;
(中略)
Client client = new Client(Protocol.HTTP);
String url = "http://www.example.com/";
Form form = new Form();
form.add("name", "value");
Representation rep = form.getWebRepresentation();
Request request = new Request(Method.POST, url, rep);
try {
String jsonStr = client.handle(request).getEntity().getText();
JsonRepresentation json = new JsonRepresentation(jsonStr);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
・参考
Restlet edition for Android
Restlet edition for Android – Sample application
taga Android JSON, REST