#前書き
Java を利用した開発において、ある程度まとまった機能は JAR にすると管理が容易になります。
これは Android 開発においても同様のことが言えます。例えば 自作 ImageView を作成した時、ImageView を拡張したソースコードをそのままプロジェクトに入れておくよりも、パッケージにして切り離した方が、他のプロジェクトで利用したくなった時でも容易に使い回す事が出来ます。
しかし、JDK 8 環境において JAR を生成する時は、バージョンの差異に対する対策が必要となります。
#コンパイル
IntelliJ IDEA を利用してコンパイルすると、JDK8 環境の場合は バージョン 1.8 のバイトコードを生成します。
しかし、この JAR を Android プロジェクトに含めてコンパイルすると
Error:Gradle: Execution failed for task ':app:preDexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/usr/lib/jvm/java-8-jdk/bin/java'' finished with non-zero exit value 1
というエラーに見舞われます。
これだけではコンパイラが異常終了したことしか分からないので、もう少し詳しく原因を追ってみると gradle:preDexDebug
において
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
というエラーが発生していることが判明します。
#対策
このエラーは、Android 自体が Java 1.7 までの対応であるために、Java 1.8 で生成されたバイトコードを利用できない事が原因です。
これを回避するには、File
→ Settings
より設定画面を開き、Build, Execution, Deployment
→ Compiler
→ Java Compiler
→ Project bytecode version
の値を空白から 1.7
に変更してからコンパイルします。
すると、コンパイル時にバージョン 1.7 のバイトコードを生成するため、Android プロジェクトでも利用できるようになります。