2016-09-19 3 views
4

Ich habe einfach Base64Images Helfer Klasse, die diesen Körper enthält:Wie lange kann String-Eigenschaft in Kotlin sein?

companion object{ 
    val ABSTRACT_COLORS = "[image encoded in base64]" 
} 

ABSTRACT_COLORS ist eigentlich eine Zeichenkette, die 570.438 Zeichen.

Beim Übersetzen bekam ich:

org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Failed to generate property ABSTRACT_COLORS 
... 
... 
The root cause was thrown at: ByteVector.java:213 at org.jetbrains.kotlin.codegen.MemberCodegen.genFunctionOrProperty(MemberCodegen.java:205) 
Caused by: java.lang.IllegalArgumentException 

Ich dachte, ich 2147483647 (231 - 1) Zeichen in einer Zeichenfolge speichern.

Warum ist das?

Ich habe dieses Bild unten gepostet.
Sie können this tool verwenden, um base64 zu generieren.

Hinweis: Bearbeiten dieser Klasse oder Kompilieren des Projekts friert Android Studio ein.
Ich würde einen leichten Editor zum Bearbeiten und Terminal verwenden, um es zu kompilieren.

enter image description here

+0

Das sieht wie ein Kompilierungsfehler aus. z.B. Wenn der Compiler fehlschlägt, weil nicht genügend Speicher zugewiesen ist, sollte die ausgelöste Ausnahme dies angeben (was nicht der Fall ist). Ich schlage vor, das Problem unter https://youtrack.jetbrains.com/issues/KT zu melden. Sie können online nach einer Möglichkeit suchen, den zugewiesenen Speicher des Kotlin-Compilers oder etwas Ähnliches zu erhöhen. – mfulton26

Antwort

4

Wie @ mfulton26 in einem Kommentar erwähnt, dass etwas mit dem Compiler los wird, wenn die Zeichenfolge geladen werden. Ein Absturzfehler, der an Kotlin issue tracker gemeldet werden sollte.

Als eine Problemumgehung können Sie dies als eine Datei in Ihrem Verzeichnis src/main/resources hinzufügen und die Zeichenfolge dynamisch entweder als String oder als ByteArray laden.

Zum Beispiel, wenn die Datei src/main/resources/abstract-colors.txt war konnte man read the entire file into a string:

val ABSTRACT_COLORS = javaClass.getResourceAsStream("/abstract-colors.txt") 
           .bufferedReader().use { it.readText() } 

Wenn Sie es nicht brauchen Base64 codiert werden, können Sie das Bild als binäres speichern und sie in ein ByteArray lesen.

val ABSTRACT_COLORS = javaClass.getResourceAsStream("/abstract-colors.jpg") 
           .use { it.readBytes() } 
+1

die Zeichenfolge hat weniger als 0,5 MB nicht 0,5 GB;) Ich weiß, ich kann den Inhalt aus Datei laden ... aber trotzdem wäre es schön, es zur Kompilierzeit zu haben. – mklimek

+0

@mklimek ah, ich habe ein "K" am Ende in meinen Gedanken hinzugefügt. –

+0

@mklimek redigiert und die Antwort verlassend (andere Leute in der Zukunft brauchen möglicherweise diese Arbeit herum, die Antwort ist für die Gemeinschaft auch) –

Verwandte Themen