Library-SWCs mit FDT erstellen

Es ist recht einfach, ein komplettes Projekt als SWC zu kompilieren: Rechtsklick auf’s Projekt -> Run as -> FDT SWC Library (Quelle). Ein Ant-Skript wäre schöner, aber grundsätzlich ist es so erst mal einfach. Was die Sache nämlich an anderer Stelle verkompliziert, ist der allseits beliebte Fehler 1047:

Parameter initializer unknown or is not a compile-time constant.

bzw.

Parameterinitialisierer unbekannt oder keine Kompilierungszeit-Konstante.

Dieser tritt dann auf, wenn man eine Konstante als default-Übergabe-Parameter nutzt, und die Klasse mit der Konstante erst nach dieser Klasse kompiliert wird. Oder so. Es gibt haufenweise Einträge dazu im Bug-Tracker, teilweise schon jahrealt, leider ohne Ergebnis. Die längste Antwort von Adobe (die nicht “OK, wird noch mal geprüft” lautet) ist “Wäre schwierig zu implementieren, machen wir nicht.”^^

Deshalb folgende Lösungsansätze:

  • Ein Workaround im Netz ist es, einfach keine Konstanten zu nutzen – das ist natürlich Quatsch.
  • Ein anderer ist es, die entsprechende Funktion zu ändern – statt “foo:Number=MyConstants.FOO” “foo:Number=NaN”. Man prüft dann in der Funktion auf NaN, und setzt ggf. dort erst die Konstante. Das funktioniert, aber das will man eigentlich nicht für externe Libraries (ich meine damit projektexterne Libraries, nicht das Projekt an sich, was hier ja auch eine Library werden soll^^) .
  • Dann: Unter Project Properties -> FDT Build Path -> Build Order die Reihenfolge der SWCs und Sourcefolder so zu ändern, dass die Klasse eben zuerst kompiliert wird. Geht auch nur, wenn Konstanten-Klasse und aufrufende Klasse in verschiedenen Packages liegen einen separaten Eintrag im Build-Path haben
  • Deshalb habe ich gerade ein neues Package einen neuen Ordner angelegt, zum Build-Path hinzugefügt, dort unter den korrekten Pfad die aufrufende Klasse verschoben, und dieses neue Package diesen neuen Ordner (heißt bei mir “compilerbug”) mit der oben beschriebenen Methode als erstes kompiliert 🙁 auch unschön, aber so muss ich wenigstens keine Klasse anderer Leute anfassen

Das nervt mich gerade extrem, hat jemand eine bessere Lösung?

Flashplayer 11, Molehill, Flare3D 2.0 in FDT 4.2

Tag,

wer die Flare3D 2.0-Beispiele* in FDT 4.2 ausprobieren möchte, dem sei der folgende Artikel an’s Herz gelegt: How to get started with the Molehill API and Away3D. OK, ist nicht für Flare3D, aber trotzdem hilfreich. Besonders wichtig:

  • Als Compiler-Argument “-swf-version=13” hinzufügen, sonst gibt’s Runtime-Fehler
  • Das dort verlinkte SDK hat keine flex.swc in frameworks/libs, was mein FDT gar nicht mochte. Aber es funktioniert mit der swc aus dem 4.1er SDK^^ Einfach rüberkopieren
  • Die flashplayer_inc_playerglobal_022711.swc kann zwar auch in einem externen Verzeichnis eingebunden sein, für FDT muss diese nicht, wie beschrieben, die originale playerglobal ersetzen. Dann kompiliert er aber leider nicht 🙂 Fehlermeldung:

Inkonsistente Verknüpfung in /xy/abc/flashplayer_inc_playerglobal_022711.swc(flash.net.drm:AddToDeviceGroupSetting, flash.net.drm:AuthenticationMethod, flash.net.drm:LoadVoucherSetting). ‘flash.net.drm:LoadVoucherSetting’ ist als extern markiert, ‘flash.net.drm:AddToDeviceGroupSetting’ aber nicht.

bzw auf Englisch:

Inconsistant linkage in /xy/abc/flashplayer_inc_playerglobal_022711.swc(flas h.net.drm:AddToDeviceGroupSetting, flash.net.drm:AuthenticationMethod, flash.net.drm:LoadVoucherSetting) – ‘flash.net.drm:LoadVoucherSetting’ is marked as extern, but ‘flash.net.drm:AddToDeviceGroupSetting’ is not.

Also doch die vorhandene playerglobal in framework/libs/player/10.2/ ersetzen. Man liest vereinzelt auch davon, dass man einen neuen Ordner “11” in frameworks/libs/player anlegen kann, das habe ich aber nicht probiert.

HTH,

Lennart

*Warum kein Away3D? Ich habe keines der beiden Frameworks bisher ausprobiert, aber hier klang Flare3D irgendwie cooler 😉

FDT+Ant: Java Heap Space und PermGen Space [Update]

Wer beim Kompilieren mit Ant in FDT einen Java Heap Space Error bekommt, kann der Java Virtual Machine mehr Speicher zuweisen. Nein, nicht über die Eclipse.ini, sondern über die Einstellungen:

Einstellungen -> Java -> Installed JREs -> [aktuelles JRE] -> Default VM Arguments -> “-Xmx512m”
(ohne Anführungszeichen; den Wert ggf. abwandeln)

Quelle

Wer dagegen einen “PermGen Space”-Error bekommt (kenne ich auch erst seit neuestem), der regelt das über die “External Tools Configuration”:

“Run”-Menü -> External Tools -> External Tools Configurations -> [aktueller Ant-Task] -> JRE -> VM Arguments -> “-Xmx512m”
(ohne Anführungszeichen)

Hier muss man etwas ausprobieren; mein Wert weicht von der Quelle ab, und die nutzt andere Einstellungen als ihre Quelle 🙂

UPDATE:

Auf http://factornine.wordpress.com/2008/04/15/how-to-increase-memory-allocated-to-eclipse/ sehe ich, wie ich mir nicht nur den aktuellen Heap Space anzeigen lassen kann, sondern auch, wie ich manuell die Garbage Collection angezeigt bekomme:

Einstellungen -> General -> Show heap status

Das Ganze sieht dann so aus:

Unexpected multiname type: 16

FDT 4 plus Flex 4 melden mir gerade

[mxmlc] Unexpected multiname type: 16
[mxmlc] Unexpected multiname type: 16
[mxmlc] /Users/Shared/workspace/foo/bar/lib/util/VectorUtils.as
[mxmlc] Fehler: Typ wurde nicht gefunden oder war keine Kompilierungszeit-Konstante: .

Keine Ahnung was das ist – aber beheben kann ich es durch Löschen aller .swf.cache-Dateien und Zurücksetzen des Compilers.

Witzigerweise gibt es einen Eintrag in den Adobe-Foren dazu, in dem auch Vector involviert ist… der scheint mir noch nicht ganz ausgereift zu sein. So kann ich zum Beispiel als Übergabeparameter einer Funktion nicht Vector.<*> angeben (auch nicht Vector.<Object>), sondern nur *, aber das führt hier vllt zu weit.

Flex4: Font Einbettung

In Flex 4 muss das Flag embedAsCFF gesetzt sein:

Falls jemand weiß, wieso/weshalb/warum, dann gerne in die Comments posten 🙂

Quelle: Hier und Franzi.

Flash Player (10.1): Verbindung mit dem Debugger herstellen

Neulich im Flash Builder: “Es wird auf die Verbindung von Adobe Flash Player mit dem Debugger gewartet”. Die kommt aber nie zustande. Ich hatte das Problem bisher immer, also auch mit dem Flash Player 9 in FDT, …, aber in diesem Fall war es der Flash Player 10.1 (Debug), OS X, Firefox, Flash Builder. Die Lösung:

  1. Run your application in debug mode
  2. Right click over the Flash movie
  3. Change the option from Localhost to “Other Machine”
  4. Type the IP address 127.0.0.1
  5. Click Connect

Danke auch an Christian 🙂

Flash: Warnung “-runtime-shared-libraries”

Mit Flex 4 kommt eine merkwürdige Warnung:

Warnung: Bei dieser Kompilierungseinheit war in den Frame-Metadaten keine factoryClass zum Laden der konfigurierten, zur Laufzeit gemeinsam genutzten Bibliotheken angegeben. Um ohne zur Laufzeit gemeinsam genutzte Bibliotheken zu kompilieren, legen Sie entweder die Option “-static-link-runtime-shared-libraries” als “true” fest oder entfernen die Option “-runtime-shared-libraries”.

Wem das nichts sagt, und wem Google nicht hilft (weil dort nämlich nur die englische Version zu finden ist): Hier die Lösung.

  1. flex-config.xml finden
  2. Zeile “static-link-runtime-shared-libraries>false</static-link-runtime-shared-libraries>” finden
  3. “false” in “true” ändern

Quelle.