2012-01-23 9 views
9

sto lavorando a estensione nativa per la piattaforma Android e sono rimasto bloccato ...Adobe AIR 3.1 estensione nativa per Android - contesto estensione nulla in ActionScript

Targeting Android 2.1 ... test su Google Nexus One (2.3 .6)

questa linea restituisce NULL

this.context = ExtensionContext.createExtensionContext("com.company.ane.LocationManager", ""); 

questo è descrittore di file di estensione:

<extension xmlns="http://ns.adobe.com/air/extension/3.1"> 
<id>com.company.ane.LocationManager</id> 
<versionNumber>0.0.1</versionNumber> 
<platforms> 
<platform name="iPhone-ARM"> 
    <applicationDeployment> 
    <nativeLibrary>libANELocationManager.a</nativeLibrary> 
    <initializer>ExtInitializer</initializer> 
    <finalizer>ExtFinalizer</finalizer> 
    </applicationDeployment> 
</platform> 
<platform name="Android-ARM"> 
<applicationDeployment>   
    <nativeLibrary>libANELocationManager.jar</nativeLibrary> 
    <initializer>com.company.ane.android.ANELocationManager</initializer> 
</applicationDeployment> 
     </platform></platforms></extension> 

che è il mio comando pacchetto:

adt -package -target ane ./../../app/libs/locationmanager.ane ./../extension.xml -swc ane_location_manager.swc -platform iPhone-ARM library.swf libANELocationManager.a -platform Android-ARM library.swf libANELocationManager.jar 

In questa estensione fase è davvero semplice ... Sto solo cercando di restituire valore stringa di nuovo al mio app ...

package com.company.ane.android; 

import java.util.HashMap; 
import java.util.Map; 

import com.adobe.fre.FREContext; 
import com.adobe.fre.FREFunction; 

import android.location.LocationListener; 
import android.location.LocationManager; 

public class ANELocationManagerContext extends FREContext { 

public LocationManager locationManager; 
public LocationListener locationListener; 

@Override 
public void dispose() { 
    // TODO Auto-generated method stub 

} 

@Override 
public Map<String, FREFunction> getFunctions() { 

    Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>(); 

    functionMap.put("ExtensionTest", new ExtensionTest()); 

    return functionMap; 
} 

    } 


package com.company.ane.android; 

import com.adobe.fre.FREContext; 
import com.adobe.fre.FREFunction; 
import com.adobe.fre.FREObject; 
import com.adobe.fre.FREWrongThreadException; 

public class ExtensionTest implements FREFunction { 

@Override 
public FREObject call(FREContext context, FREObject[] args) { 

    FREObject result = null; 
    //ANELocationManagerContext ctx = (ANELocationManagerContext) context; 


    try 
    { 
     result = FREObject.newObject("It works!"); 

    } 
    catch (FREWrongThreadException fwte) 
    { 
     fwte.printStackTrace(); 
    } 

    return result; 
} 

} 


package com.company.ane.android; 

import com.adobe.fre.FREContext; 
import com.adobe.fre.FREExtension; 

public class ANELocationManager implements FREExtension { 

@Override 
public FREContext createContext(String contextType) { 

    return new ANELocationManagerContext(); 
} 

@Override 
public void dispose() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void initialize() { 
    // TODO Auto-generated method stub 

} 

} 
+0

Hai mai trovato una soluzione? Gli ANE che ho creato qualche tempo fa erano a posto. Oggi quando ne sto facendo di nuovi, sto ricevendo il tuo errore esatto. Anche con il codice ho fatto qualche mese fa e non ho cambiato nulla ... – brybam

risposta

1

Dove sono ottieni il riferimento NULL? È in esecuzione sul dispositivo o nel simulatore AIR?

Se ExtensionContext non può essere trovato per la piattaforma corrente su cui si sta eseguendo (ad esempio: simulatore di windows) viene restituito NULL, anche se potrebbe funzionare correttamente sul dispositivo. È possibile impostare un contesto predefinito quando si compila l'ANE che verrebbe utilizzato laddove non venga trovata una corrispondenza specifica. Questo target predefinito può essere scritto interamente in AS3 ed è utile per simulare o gestire dispositivi non supportati.

La documentazione di Adobe AIR contiene ulteriori dettagli sull'inserimento di un'implementazione predefinita. Vedi qui: http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-2482335412ffea65006-8000.html

MODIFICA: Whoops, vedo che stai correndo sul dispositivo. Proverei ancora uno di default e vedere se riesci a farlo funzionare, potrebbe aiutare a restringere il problema.

MODIFICA 2: Si sta implementando l'interfaccia FREExtension (in Java)? Non lo vedo nel tuo codice postato.

+0

Non riesco a controllare il codice in questo momento, ma sono sicuro al 99% ... –

+1

È difficile rintracciare il problema senza guardare a tutti il codice Java, quella parte del codice potrebbe essere dove il bug esiste. Quando puoi, ti consiglio di confrontarlo con i documenti di Adobe per assicurarti che inizializzi correttamente il contesto. –

+0

Aggiungerò il bit mancante quando avrò accesso al resto del codice ... Lasciato in ufficio ... Ma sono abbastanza sicuro che vada bene ... Preferirei pensare che ci deve essere qualcosa di sbagliato con il setup o il modo in cui impacchetta il tutto ... –

3

L'estensione più semplice include ancora 2 classi.

è necessario implementare l'interfaccia FREExtension:

package com.your.package; 

import com.adobe.fre.FREContext; 
import com.adobe.fre.FREExtension; 

public class YourExtension implements FREExtension 
{ 
public static FREContext context; 

@Override 
public FREContext createContext(String contextType) 
{ 
    return context = new YourContext(); 
} 

@Override 
public void dispose() 
{ 
    context = null; 
} 

@Override 
public void initialize() 
{ 
} 
} 

E poi il contesto è la classe si dispone sopra:

package com.your.package; 

import java.util.HashMap; 
import java.util.Map; 

import com.adobe.fre.FREContext; 
import com.adobe.fre.FREFunction; 

public class YourContext extends FREContext 
{ 
@Override 
public void dispose() 
{ 
} 

@Override 
public Map<String, FREFunction> getFunctions() 
{ 
    Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>(); 
    // Create your map  
    return functionMap; 
} 
} 

La classe nel xml dovrebbe essere il primo qui, cioè l'implementazione di FREExtension.

Inoltre, a meno che non si stia creando la versione per iPhone di questa estensione, è necessario rimuovere il nodo iPhone dal file extension.xml.

+1

Faccio tutte queste cose ... guarda il mio codice ... –

+1

La prossima cosa da verificare è che si sta effettivamente impacchettando l'estensione con la propria applicazione. Puoi seguire una cosa del genere: http://labs.distriqt.com/post/815. Basta controllare che la casella di controllo "Pacchetto" sia selezionata per ciascuna delle piattaforme di confezionamento di build. Stai usando FB4.6? – Michael

7

Ho avuto esattamente lo stesso problema. Il mio ANE funzionava perfettamente su iOS, su simulatore, con la lib di default usata, ma non funzionava su un vero dispositivo Android (piattaforma Android-ARM).

E ExtensionContext.createExtensionContext() restituiva null.

Si è scoperto che questo problema è il problema della versione degli strumenti, versione del compilatore Java. Stavo usando l'ultima AIR (3.8), JDK (1.7.25), Android SDK (22.0.5), ecc. Non ha funzionato.

Ma dopo aver aggiunto -target 1.6 a javac chiamata, ha funzionato bene.

2

ho avuto lo stesso problema prima e in realtà il problema non era la funzione() createExtensionContext in sé ma la classe FREContext e la maggior parte del tempo che happend nel metodo map getFunctions pubblici()

In sostanza, per esempio ho dichiarato 3 FREFunctions da utilizzare nei miei FREContext come:

functionMap.put("initMe", new initFunction()); 
functionMap.put("getVersion", new getVersion()); 
functionMap.put("showBrowser", new showBrowser()); // For example, I got some exceptions in this function as I declare some Java variable that is not supported by the current Android SDK version like LocationManager (for example) 

Così, quando il FREContext viene inizializzato, questa classe volontà passa attraverso il costruttore di ogni funzione all'interno e se ho avuto alcune eccezioni da qualche parte nel costruttore di getVersion (), il FREContext andrà in crash e restituirà null a createExtensionContext(). La soluzione a questo problema è che se non si è sicuri di dove si ottiene l'eccezione, annotare tutti i FREFunction uno per uno per capire quale causa l'eccezione. Nel tuo caso, dubito che il 2 variabili

public LocationManager locationManager; 
    public LocationListener locationListener; 

sono le cause della deroga. Per favore commentali e riprova. Un'altra cosa che può essere di grande aiuto quando si costruisce l'ANE è provare a eseguire il debug di ANE dal tuo ADT collegando la porta corrente dell'app Android Android al debugger di ADT. Per ulteriori informazioni su come eseguire il debug di ANE da questo articolo http://www.adobe.com/devnet/air/articles/ane-android-devices.html

Spero che sia d'aiuto.

0

Ho incontrato lo stesso problema quando si cerca di costruire ANE-Video:

_context = ExtensionContext.createExtensionContext(EXTENSION_ID, null); 

// _context is set to null, with no other error info 

ho risolto il problema compilando con un 1,6 JDK invece di un 1,7 JDK (in esecuzione su Mac OS X Mavericks).

This post ha aiutato temporaneamente a riportare il JDK a 1.6.

L'indizio è venuto da this Adobe article:

A questo punto Adobe utensili non è del tutto compatibile con Java 7 e si può incorrere in errori a collegare e il tempo di imballaggio.

+0

Perché stavi passando ** null ** nel parametro? –

+1

Ho passato 'null' perché questo indica che' contextType' non è specificato. Vedi Adobe ExtensionContext [documenti] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExtensionContext.html#createExtensionContext()). –