コンテンツへスキップ
ものがたり
戻る

Java 7でandroid apkをビルドできない問題の解決方法

小ネタ。kernel.orgクラック以来落ちっぱなしのandroid.git.kernel.orgが復旧したら書こうと思っていたのだけど、全然戻ってこないので、ソースへのリンク無しで書いちゃえ。

Java 7 SDKでビルドした.classファイルは、そのままではAndroidのDalvikのclasses.dex(apkに含まれているdalvikのバイトコードを全部まとめたやつ)に変換することができない。これはdxの com.android.dx.dex.cf.CfTranslator#translate() に渡されている com.android.dx.dex.cf.CfOptions のstrictNameCheckフィールドがデフォルトでtrueになっていて、com.android.dx.cf.direct.DirectClassFile が入力classファイルのバージョンをチェックして、51 (0033h) を拒絶するようにしているためだ。

だから、Java 7環境で生成したクラスファイルを対象にdxを実行すると、以下のようなメッセージが出てきて、そのクラスはclasses.dexに含まれないことになる:

trouble processing:  

bad class file magic (cafebabe) or version (0033.0000)  

...while parsing foo/bar/Baz.class  

...while processing foo/bar/Baz.class

これを回避するには、コマンドラインツールのdxであれば、—no-strictオプションを渡してやると良い。その他の方法で直接CfTranslatorを呼び出しているのであれば、上記のstrictNameCheckをfalseにして処理すると良い。

ただしJava 7のバイトコードをdxが従来通りに処理してくれるかどうかは分からない(そのためにバージョンチェックがあって、それをoffにして使っているということは心に留めておくべき)。


この記事を共有:

前の記事
MonoDevelop 2.6 released
次の記事
初めてのWindows Phone 7プログラミング