2013-04-24 31 views
6

Lo vibration ane di Adobe funziona bene in un'app mobile Flex sia su iOS che Android, ma quando provo a lanciare un simulatore AIR da Flash Builder 4.7 su Windows 7 ottengo l'errore:Adobe ANE funziona su dispositivi iOS e Android, ma non nel simulatore AIR

enter image description here

enter image description here

Ecco una copia del messaggio di errore da questi ultimi 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 

Allo stesso tempo:

  1. Un'altra ANE da Adobe - il GameCenter.ane incluso con Adobe Gaming SDK funziona perfettamente con il simulatore AIR

  2. Il com.adobe.extensions.Vibration.ane di cui sopra doesn non riesco a selezionare il simulatore BlackBerry AIR (ma i simulatori AIR di iOS e Android non funzionano).

C'è un modo per rendere questo lavoro più confortevole?

Mi piacerebbe utilizzare com.adobe.extensions.Vibration.ane nella mia app mobile Flex, ma voglio anche usare il simulatore AIR - senza commentare il codice sorgente e rimuovere l'ANE dalle proprietà del progetto.

UPDATE 2016:

Adobe ha aggiornato il suo sostegno Vibration native extension (ANE) sample con 64-bit.

risposta

3

Il il problema con l'ANE è che non è un'implementazione completa. La cosa più importante è che l'ANE non implementa un'implementazione di fallback predefinita, che è ciò a cui il dispositivo farebbe il fallback se non ci fosse una particolare implementazione per la piattaforma corrente.

Ciò rende l'ANE molto difficile da utilizzare nello sviluppo multipiattaforma poiché in alcuni casi non riuscirà. Qualsiasi piattaforma che non sia specificatamente inclusa fallirà con il messaggio che hai ricevuto.

Fondamentalmente senza modificare l'ANE da soli, non sarà possibile utilizzarlo come ci si aspetta. Il tuo unico modo è fare una compilation in stile condizionale e non chiamare l'ANE nel simulatore.

Se si desidera modificare l'ANE, l'opzione migliore è implementare la libreria predefinita. Questo è abbastanza semplice, ma avrai bisogno di: XCode, eclipse con gli strumenti di sviluppo di Android e adad da AIR SDK.

In primo luogo è necessario compilare i progetti esistenti, il lib Android, il lib iOS e la libreria ActionScript esistente, per generare VibrationAndroidLibrary.jar, libVibrationiOSLibrary.a e VibrationActionScriptLibrary.swc rispettivamente.

Avrete quindi bisogno di fare un'altra libreria ActionScript e duplicare la classe com.adobe.nativeExtensions.Vibration come di seguito:

public class Vibration 
{ 
    public function Vibration() 
    { 
    } 

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

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

Questa classe sostituirà l'altra classe nei casi in cui l'estensione isn' implementato invece di ottenere il messaggio precedente.

Poi avremo bisogno di aggiungere la definizione di default per il file diextension.xml:

<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> 

Poi abbiamo bisogno di ricompilare l'ANE utilizzando il nuovo SWC predefinita ActionScript. Diciamo che sei nella directory VibrationNEDeliverables dal già citato ANE, puoi inserire questo in un file bash ed eseguirlo o metterlo tutto su una riga dalla riga di comando). Le prime due linee estraggono il file library.swf e lo spostano nelle posizioni richieste dal comando package. Fai attenzione ai percorsi ecc. Qui, ho pensato che tu abbia inserito la lib predefinita in VibrationActionScriptDefaultLibrary ma dovrai cambiarla in modo appropriato.

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 . 

Una volta che questo è completo ora si dovrebbe avere una nuova versione del ANE con un lib default che renderà molto più utilizzabile! Personalmente non penso che un ANE dovrebbe essere rilasciato senza di esso.

Se avete bisogno di un ANE completamente funzionale, è possibile controllare il nostro: http://distriqt.com/native-extensions

+0

Grazie Michael, ho già notato i tuoi ANE e considero di acquistarli. La tua vibrazione ANE supporta Blackberry? Inoltre, perché la tua vibrazione ANE è elencata come non supporta iPod Touch? –

+1

Non abbiamo ancora implementato il supporto Blackberry, in realtà non abbiamo ricevuto alcuna richiesta per questo. La vibrazione non è supportata su iPod Touch poiché questo dispositivo non ha hardware per vibrazione al suo interno. Cheers – Michael

+1

Il tuo metodo ha funzionato per me senza dover ricostruire nulla in Xcode e Android Eclipse: ho estratto 'VibrationAndroidLibrary.jar' e' libVibrationiOSLibrary.a' da Adobe 'ReadyToUseExtension \ com.adobe.extensions.Vibration.ane'. Inoltre ho omesso la parte '-storetype pkcs12 -keystore YOUR_SIGNING_KEY.p12 -storepass KEY_PASSWORD' del comando adt. –

1

Una soluzione che ho usato in passato è stato qualcosa di simile:

  • Creare una classe di utilità che restituisce se si sta in esecuzione su un dispositivo che supporta l'ANE. Nel mio caso, la classe conteneva un metodo statico che controllava il valore di Capabilities.os. Vedere l'elenco dei valori che può restituire here.

  • Inserire il codice che chiama i metodi ANE nella propria funzione e chiamare questa funzione se l'ANE è supportato. Se ricordo bene, era necessario inserire il codice che ha utilizzato l'ANE in una funzione separata, non solo all'interno di un blocco if, altrimenti lo stesso errore si sarebbe verificato nel simulatore:

fare questo:

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

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

Invece di fare tutto in una funzione come questa:

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

Sfortunatamente il tuo metodo non funziona con Adobe Vibration ANE. –

1

stesso problema esiste con il nuovo ane vibrazione incorporata per la compatibilità ios 64bit. La soluzione alternativa era posizionare l'istruzione import di ane all'interno della funzione che in realtà chiamava il metodo vibra e deselezionare la casella di inclusione per ane nelle impostazioni del percorso di generazione del progetto per android e ios.

Nella mia applicazione ho una variabile flag (impostata da una funzione separata) che indica se l'app viene eseguita all'interno dell'ide. La vista che utilizza la vibrazione chiamerà la funzione di vibrazione sopra solo se il flag è impostato sulla modalità non IDE. Ricevo ancora un avvertimento iniziale quando eseguo il simulatore ide, ma non l'errore critico. Quando eseguo una build di rilascio, FlashBuilder mi obbliga a spuntare la casella di inclusione per l'ane nelle impostazioni del percorso di generazione del progetto applicabile (devo deselezionarlo nuovamente la prossima volta che voglio eseguire il simulatore).

È goffo, ma rende lavorabile con l'ane vivibile. Mi fa capire che Adobe non ha affrontato questo problema.

+0

una soluzione ancora migliore - ho appena contratto un deviatore su upwork per aggiungere un'implementazione di "libreria predefinita" all'animazione ... ora posso usarlo in modalità di debug senza problemi. Sentiti libero di usarlo: https://www.dropbox.com/s/qwvcbsx6ymrx8rz/com.adobe.extensions.Vibration.ane?dl=0 –