Wenn ich einen Lambda-Ausdruck in einem Android-Bibliotheksmodul verwende, erhalte ich eine Compiler-Ausnahme com.sun.tools.javac.code.Symbol$CompletionFailure: class file for java.lang.invoke.MethodType not found
.
Lambda-Ausdrücke kompilieren ohne Fehler, wenn sie im Android-Anwendungsmodul verwendet werden.
Ein Beispielprojekt zur Demonstration des Problems finden Sie hier: Ссылка
Die interessanten Klassen im Beispiel sind MyLibrary.java und MainActivity.java. Jede Klasse enthält die identischen Ausdrücke.
Einrichtung
%Vor%Ich bin nicht daran interessiert, Retro-Lambda zu verwenden. Ich würde das gerne durch die richtige Konfiguration bringen. Ich nehme an, dass ich irgendwo einen Schritt verpasse.
Nur um zurück zu kreisen und hinzuzufügen, was ich gelernt habe.
Ich konnte den Fehler MethodType not found
umgehen, indem ich das Runtime-Jar meiner JAVA HOME zu grades bootclasspath in der build.gradle-Datei des Projekts hinzufüge.
Die App wurde jedoch nicht auf einem Gerät oder in einem Emulator bereitgestellt, da der Task " app:transformClassesWithPreJackPackagedLibrariesForDebug
gradle" fehlschlägt. Es erfordert, dass alle Interfaces, die als Lambda verwendet werden, sich auf dem Klassenpfad befinden. Der bootclasspath-Fix hat den Klassenpfad für den Jack-Compiler nicht festgelegt und Bibliotheken verwenden den Jack-Compiler noch nicht.
Ich habe zu diesem Problem einen Fehlerbericht geöffnet: Ссылка
Sie sagten, dass dies in naher Zukunft angesprochen werden wird.
Ich habe das Problem gelöst, indem ich JAR mit Java-Quellen als Abhängigkeit anstelle der kompilierten JAR eingefügt habe. So habe ich meine Projekte konfiguriert:
In der Bibliothek build.gradle
:
In der App build.gradle
:
Natürlich ist die Bibliothek als externes Projekt in der App settings.gradle
Tags und Links android lambda android-library android-studio-2.2 jack-compiler