まとめてみようと思いました。
参考にしている書籍は以下の本なので、若干古い情報もあるかもしれないが、
コードは動作したもののみを載せます。
http://www.amazon.co.jp/dp/4894710803
JNIを使う理由
・PureJavaでは実現できないパフォーマンスが必要なとき
・過去のアプリケーションライブラリを有効活用したいとき
パフォーマンスの問題は、JVMの成熟やJIT(ジャストインタイム)コンパイラによって
改善に向かっていますが、すべてを解決してくれるわけではありません。
JNI以外の手法(JRI、RNI)も存在するが、AndroidアプリケーションがNDK(JNI)をサポート
したためか、2014年現在、存在感を失っています。
Javaアプリケーションがネイティブメソッドを実行するということ
ホストのハードウェア上で直接、ネイティブコードが走ります。つまり、
JavaコードはJavaバイトコード(classファイル)にコンパイルされ、JVMがバイトコードと
ホストハードウエアの間を媒介する形で実行しますが、ネイティブコードはJVMの管理外で
走るということです。
ネイティブコードはJVMが媒介しないで実行可能な、プラットフォーム固有のオブジェクトコードです。
ネイティブコードとは
一般にダイナミック(動的)ロードライブラリの中に入れます。ライブラリを作成する場合は、ホストマシンのネイティブコンパイラとリンカを
使用してライブラリをビルドします。
ネイティブコンパイラが作成するオブジェクトコードはプラットフォーム固有なので、
ライブラリも同様です。
再ビルドは必要ない(バイナリ互換性がある)
JNIのAPI(アプリケーションプログラミングインターフェイス)の規則に従って作成された
バイナリオブジェクトがプラットフォームX上のライブラリに入っているならば、
ライブラリを再ビルドすることなく、JNIをサポートしたJVMを介して使用することが出来ます。
JNIの特徴
・Javaオブジェクトの中身が見えない方法で参照を提供する
・JVMとネイティブコードの間に関数テーブルを配置し、JVMのデータにアクセスする場合は必ずその関数を経由する
・ネイティブの型集合を定義し、Javaの型からプラットフォーム固有な型への一様なマッピングを提示する
・メモリの喪失への対応(ユーザが連続したメモリ領域を期待する場合のために、オブジェクトのメモリの扱い方についてJVMに柔軟性をもたせる。文字列や数値配列データを返すJNI関数は、ネイティブコードがメモリ領域を使用している間にメモリ管理システムがその領域を移動しないように、メモリ領域をロックする可能性がある)
コードが無いとイメージしづらい部分もあると思います。
それらは後で実際にコードを動作させて見てみようと思います。
さらに詳細な特徴もあります。メソッドの呼び出しやオブジェクトの生成、変数へのアクセス、例外処理、ネイティブメモリの管理モニタ、クラスのロード、JVMの生成 などにJNIの特徴・良い点があります。
次に続く。
0 件のコメント:
コメントを投稿