When I use a lambda expression in an Android Library Module, I receive a compiler exception com.sun.tools.javac.code.Symbol$CompletionFailure: class file for java.lang.invoke.MethodType not found
.
Lambda expressions are compiling without error when used in the Android application module.
A sample project to demonstrate the problem can be found here:
https://github.com/adamdye/AndroidLambdaIssue
The interesting classes in the example are MyLibrary.java and MainActivity.java. Each class contains the identical expressions.
Setup
Android Studio 2.2 preview 1
min/target SDK version = android-N
build tools version = 24.0.0.rc4
jack compiler enabled
source/target compatibility = 1.8
Gradle version = 2.10
Android Plugin Version = 2.2.0-alpha1
JDK = java 8
I am not interested in using retro-lambda. I'd like to get this working through proper configuration. I assume I'm missing a step somewhere.
Just to circle back, and add what I've learned.
I was able to get past the MethodType not found
error by adding my JAVA HOME's runtime jar to gradle's bootclasspath in the project's build.gradle file.
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xbootclasspath/a:" + System.properties.get("java.home") + "/lib/rt.jar"
}
}
}
However, the app would not deploy to a device or emulator because the app:transformClassesWithPreJackPackagedLibrariesForDebug
gradle task fails. It requires that all interfaces that are used as a lamba are on the classpath. The bootclasspath fix did not set the classpath for the Jack compiler and libraries do not use the Jack compiler yet.
I opened a bug report on this issue: https://code.google.com/p/android/issues/detail?id=211386
They commented that this will be addressed in the near future.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With