2013-04-24 18 views
6

Die von Adobe funktioniert gut in einer mobilen Flex App sowohl auf iOS und Android, aber wenn ich versuche, einen AIR-Simulator von Flash Builder 4.7 auf Windows 7 zu starten ich erhalte den Fehler:Adobe ANE funktioniert auf iOS- und Android-Geräten, aber nicht im AIR-Simulator

enter image description here

enter image description here

Hier ist eine Kopie der Fehlermeldung von diesem Screenshot:

Process terminated without establishing connection to debugger. 

The content cannot be loaded because there was a problem loading an extension: Error: Requested extension com.adobe.Vibration is not supported for Windows-x86. 

Launch command details: "C:\Program Files\Adobe\Adobe Flash Builder 4.7 (64 Bit)\sdks\4.6.0 (AIR 3.5)\bin\adl.exe" -runtime "C:\Program Files\Adobe\Adobe Flash Builder 4.7 (64 Bit)\sdks\4.6.0 (AIR 3.5)\runtimes\air\win" -profile extendedMobileDevice -screensize 640x920:640x960 -XscreenDPI 326 -XversionPlatform IOS -extdir "C:\Users\xxx\Adobe Flash Builder 4.7\.metadata\.plugins\com.adobe.flexbuilder.project.ui\ANEFiles\MyApp-Mobile\win32\" C:\Users\xxx\Documents\MyApp\mobile\bin-debug\MyApp-app.xml C:\Users\xxx\Documents\MyApp\mobile\bin-debug 

Zur gleichen Zeit:

  1. Ein weiterer ANE von Adobe - die GameCenter.ane mit Adobe Gaming SDK Werke enthalten einwandfrei mit dem AIR Simulator

  2. Die com.adobe.extensions.Vibration.ane oben erwähnt Doesn nicht fehlschlagen, wenn ich den BlackBerry AIR-Simulator auswähle (aber die iOS- und Android-AIR-Simulatoren funktionieren nicht).

Gibt es eine Möglichkeit, diese Arbeit komfortabler zu machen?

Ich möchte die com.adobe.extensions.Vibration.ane in meiner mobilen Flex-App verwenden, aber ich möchte auch den AIR-Simulator verwenden - ohne den Quellcode zu kommentieren und diesen ANE aus den Projekteigenschaften zu entfernen.

UPDATE 2016:

Adobe hat ihre Vibration native extension (ANE) sample mit 64-Bit-Unterstützung aktualisiert.

Antwort

3

Die Problem mit dem ANE ist, dass es keine vollständige Implementierung ist. Am wichtigsten ist, dass der ANE keine Standard-Fallback-Implementierung implementiert, auf die das Gerät zurückgreifen würde, wenn es keine bestimmte Implementierung für die aktuelle Plattform gäbe.

Dies macht den ANE sehr schwierig in der plattformübergreifenden Entwicklung zu verwenden, da er in einigen Fällen fehlschlagen wird. Jede Plattform, die nicht speziell enthalten ist, schlägt mit der Nachricht fehl, die Sie erhalten haben.

Grundsätzlich, ohne den ANE selbst zu ändern, können Sie ihn nicht so verwenden, wie Sie es erwarten. Ihre einzige Möglichkeit besteht darin, eine bedingte Stilkompilierung durchzuführen und den ANE nicht im Simulator aufzurufen.

Wenn Sie den ANE ändern möchten, ist es am besten, die Standardbibliothek zu implementieren. Dies ist ziemlich einfach, aber Sie benötigen: XCode, Eclipse mit Android-Dev-Tools und adt aus dem AIR SDK.

Zunächst müssen Sie die bestehenden Projekte, die Android-lib, die iOS lib und die vorhandene Actionscript-Bibliothek kompilieren, VibrationAndroidLibrary.jar, libVibrationiOSLibrary.a und VibrationActionScriptLibrary.swc jeweils zu erzeugen.

Sie werden dann eine andere Actionscript-Bibliothek vornehmen müssen, und die com.adobe.nativeExtensions.Vibration Klasse duplizieren, wie unten:

public class Vibration 
{ 
    public function Vibration() 
    { 
    } 

    public static function get isSupported():Boolean 
    { 
     return false; 
    } 

    public function vibrate(duration:Number):void 
    { 
    } 
} 

Diese Klasse wird die andere Klasse in Fällen ersetzen, wo die Verlängerung isn‘ t implementiert, anstatt dass Sie die obige Nachricht erhalten.

Dann müssen wir die Standard-Definition auf die extension.xml Datei hinzufügen:

<extension xmlns="http://ns.adobe.com/air/extension/2.5"> 
    <id>com.adobe.Vibration</id> 
    <versionNumber>1</versionNumber> 
    <platforms> 
     <platform name="Android-ARM"> 
      <applicationDeployment> 
       <nativeLibrary>VibrationAndroidLibrary.jar</nativeLibrary> 
       <initializer>air.extensions.VibrationExtension</initializer> 
       <finalizer>air.extensions.VibrationExtension</finalizer> 
      </applicationDeployment> 
     </platform> 
     <platform name="iPhone-ARM"> 
     <applicationDeployment> 
      <nativeLibrary>libVibrationiOSLibrary.a</nativeLibrary> 
      <initializer>ExtInitializer</initializer> 
      <finalizer>ExtFinalizer</finalizer> 
      </applicationDeployment> 
     </platform> 

     <platform name="default"> 
      <applicationDeployment /> 
     </platform> 

    </platforms> 
</extension> 

Dann werden wir die ANE mit dem neuen Standard-Action SWC neu kompiliert werden müssen. Sagen wir, Sie sind in der VibrationNEDeliverables -Verzeichnis von der genannten ANE, können Sie dies in eine Bash-Datei eingeben und führen Sie es oder alles in einer Zeile von der Befehlszeile). Die ersten paar Zeilen extrahieren einfach die Datei library.swf und verschieben sie an die Stellen, die der Paketbefehl benötigt. Seien Sie vorsichtig mit den Pfaden usw. Hier habe ich angenommen, dass Sie die Standard-Lib in VibrationActionScriptDefaultLibrary gesetzt haben, aber Sie müssen dies entsprechend ändern.

unzip -o -d VibrationActionScriptLibrary/bin VibrationActionScriptLibrary/bin/VibrationActionScriptLibrary.swc 
unzip -o -d VibrationActionScriptDefaultLibrary/bin VibrationActionScriptDefaultLibrary/bin/VibrationActionScriptDefaultLibrary.swc 

cp VibrationActionScriptLibrary/bin/library.swf VibrationiOSLibrary/build/Release-iphoneos/. 
cp VibrationActionScriptLibrary/bin/library.swf VibrationAndroidLibrary/bin/. 

adt -package \ 
    -storetype pkcs12 -keystore YOUR_SIGNING_KEY.p12 -storepass KEY_PASSWORD \ 
    -target ane com.adobe.extensions.Vibration.ane VibrationActionScriptLibrary/src/extension.xml \ 
    -swc VibrationActionScriptLibrary/bin/VibrationActionScriptLibrary.swc \ 
    -platform iPhone-ARM -C VibrationiOSLibrary/build/Release-iphoneos . \ 
    -platform Android-ARM -C VibrationAndroidLibrary/bin . \ 
    -platform default -C VibrationActionScriptDefaultLibrary/bin . 

Sobald das ist komplett Sie jetzt eine neue Version des ANE mit einem Standard-lib haben sollte, die es viel mehr nutzbar machen wird! Persönlich denke ich nicht, dass ein ANE ohne es veröffentlicht werden sollte.

Wenn Sie einen voll funktionsfähigen ANE benötigen, können Sie unsere Check-out: http://distriqt.com/native-extensions

+0

Danke Michael, ich habe deine ANE schon bemerkt und erwäge sie zu kaufen. Unterstützt Ihr Vibration ANE Blackberry? Warum wird Ihr Vibration ANE nicht als iPod Touch unterstützt? –

+1

Wir haben den Blackberry-Support noch nicht implementiert, wir hatten eigentlich keine Anfragen dazu. Die Vibration wird vom iPod Touch nicht unterstützt, da dieses Gerät keine Vibrationshardware enthält. Prost – Michael

+1

Ihre Methode hat für mich funktioniert, ohne etwas in Xcode und Android Eclipse neu zu erstellen: Ich habe 'VibrationAndroidLibrary.jar' und' libVibrationiOSLibrary.a' aus Adobes 'ReadyToUseExtension \ com.adobe.extensions.Vibration.ane' extrahiert. Außerdem habe ich den '-storetypkcs12-keystore YOUR_SIGNING_KEY.p12 -storepass KEY_PASSWORD' Teil des adt-Befehls weggelassen. –

1

Eine Lösung, die ich in der Vergangenheit verwendet habe, war so etwas wie diese:

  • eine Utility-Klasse erstellen, die zurückgibt, ob Sie auf einem Gerät laufen lassen, der die ANE unterstützt. In meinem Fall enthielt die Klasse eine statische Methode, die den Wert Capabilities.os überprüfte. Siehe die Werteliste, die zurückgegeben werden kann here.

  • Setzen Sie den Code, der die ANE-Methode (n) aufruft, in ihre eigene Funktion und rufen Sie diese Funktion auf, wenn der ANE unterstützt wird. Wenn ich mich recht erinnere, war es notwendig, den Code zu setzen, den die ANE in einer separaten Funktion verwendet, nicht nur innerhalb einer if-Block, sonst wird der gleiche Fehler im Simulator auftreten würde:

tun:

public function doSomethingThatWillUseANE():void 
{ 
    if (DeviceCapabilities.supportsANE) // static utility class 
    { 
     methodThatUsesANE(); 
    } 
} 

private function methodThatUsesANE() 
{ 
    // execute actual ANE method here 
} 

Anstatt sie alle in einer Funktion wie folgt vorgehen:

public function doSomethingThatWillUseANE():void 
{ 
    if (DeviceCapabilities.supportsANE) // static utility class 
    { 
     // execute actual ANE method here 
    } 
} 
+0

Leider funktioniert Ihre Methode nicht für Adobe Vibration ANE. –

1

gleiches Problem besteht mit der neuesten Vibration anen für ios 64-Bit-Kompatibilität gebaut. Meine Problemumgehung bestand darin, die Anweisung ane import innerhalb der Funktion zu platzieren, die tatsächlich die Methode vibrate aufgerufen hat, und das Kontrollkästchen include für die Option in den Einstellungen für den Buildpfad des Projekts für android und ios zu deaktivieren.

Ich habe eine Flag-Variable (durch eine separate Funktion) in meiner Anwendung, die kennzeichnet, ob die App innerhalb der IDE ausgeführt wird. Die Ansicht, die Vibration verwendet, ruft nur die obige Vibrationsfunktion auf, wenn das Flag auf Nicht-IDE-Modus gesetzt ist. Ich bekomme immer noch eine erste Warnung, wenn ich den IDE-Simulator starte, aber nicht den kritischen Fehler. Wenn ich einen Release-Build mache, zwingt FlashBuilder mich, das Include-Feld für die Ane in den entsprechenden Build-Pfad-Einstellungen zu markieren (ich muss es beim nächsten Mal wieder deaktivieren, wenn ich den Simulator ausführen möchte).

Es ist klobig, aber es macht die Arbeit mit der ane lebenswert. Schreckt mich bis zum Ende dieses Adobe hat das nicht angesprochen.

+0

eine noch bessere Lösung - Ich habe gerade einen Entwickler mit Upwork beauftragt, um eine "Standard-Bibliothek" -Implementierung zu den Vibrationen hinzuzufügen ... jetzt kann ich es im Debug-Modus ohne Problem verwenden. Fühlen Sie sich frei, es zu benutzen: https://www.dropbox.com/s/qwvcbsx6ymrx8rz/com.adobe.extensions.Vibration.ane?dl=0 –