Lambda verursacht eine Compiler-Ausnahme im Android-Bibliotheksmodul

8

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.

    
Adam Dye 25.05.2016, 23:28
quelle

2 Antworten

7

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.

%Vor%

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.

    
Adam Dye 08.06.2016, 00:40
quelle
0

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 :

%Vor%

In der App build.gradle :

%Vor%

Natürlich ist die Bibliothek als externes Projekt in der App settings.gradle

enthalten     
J. Kerber 19.02.2017 18:36
quelle