連載のおまけ: Xamarin.Android ARTのJNI実装とICSのメモリ管理

まさかの4分割となってしまった某連載のAndroidの回ですが、4回目の分についてはいくつか補遺を書いていたのでした。分割を口実にちまちまと1週間ごとに補足を載せるつもりだったのですが、2回目以降は一括で処理されてしまったので、ここにおまけとして載せておきます。

まずJava Interopアーキテクチャのセクションではこちら:

コラム: ARTランタイムにおけるJNIの実装の違い

Xamarin.Androidバージョン4.12には、ARTランタイムにおける動作にかかる修正が加えられている。ARTにおけるJNIの仮想メソッド呼び出しの実装が、Dalvikのものとは完全に互換になっていなかったというバグがあり、また他にもGCにおけるグローバル参照の扱いにバグがあったことを受けて、いくつかの回避コードが追加されている。まだ、これらの問題に起因して、挙動が想定外になっている可能性はある。

 

それとGCまわりのセクションでこちら:

 

コラム: Android 4.0 のメモリ管理仕様の変更

Android 4.0(Ice Cream Sandwich)がリリースされた時、Xamarin.Android開発チームは、それまでのXamarin.AndroidでビルドされたアプリケーションがAndroid 4.0環境でクラッシュすることを発見した。その原因は、Android 4.0で導入されたASLR(アドレス空間配置のランダム化)の導入と、JNIにおけるローカル参照・グローバル参照の実装の変更にあった。それまでAndroidのアプリケーションはアプリケーション内で固定アドレスにロードされており、Dalvik VMで一旦確保されたメモリのアドレスは変更されず、ローカル参照とグローバル参照も一致していたのが、Android 4.0から「まともに」区別されるようになったのである。現在のXamarin.Androidでは、もちろん当時のようなクラッシュは発生しない。AndroidJavaライブラリの実装でも、ObjectクラスのhashCode()メソッドの実装を眺めてみると面白いだろう。

…まあどちらも小ネタでした。