2012-01-23 11 views
9

estoy trabajando en extensión nativa para la plataforma Android y me quedé atrapado ...Adobe AIR 3.1 extensión nativa para Android - contexto extensión nula en ActionScript

Orientación Android 2.1 ... prueba en Google Nexus One (2.3 .6)

esta línea devuelve NULL

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

este es el archivo descriptor de la extensión:

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

que son órdenes del paquete:

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 

En esta etapa de extensión es muy simple ... Sólo estoy tratando de volver valor de cadena de nuevo a mi aplicación ...

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

¿Alguna vez encontró una solución? Los ANE que creé hace un tiempo estaban bien. Hoy cuando estoy haciendo nuevos, obtengo tu error exacto. Incluso con el código que hice hace unos meses y no cambié nada ... – brybam

Respuesta

1

Dónde están ¿Obtienes la referencia NULL? ¿Se está ejecutando en el dispositivo o en el simulador de AIR?

Si no se puede encontrar ExtensionContext para la plataforma actual en la que se está ejecutando (por ejemplo: simulador de Windows) se devuelve NULL, aunque podría funcionar correctamente en el dispositivo. Puede configurar un contexto predeterminado al compilar el ANE que se usaría donde no se encuentre una coincidencia específica. Este objetivo predeterminado se puede escribir completamente en AS3 y es útil para simular o manejar dispositivos no compatibles.

La documentación de Adobe AIR contiene más detalles sobre la inclusión de una implementación predeterminada. Vea aquí: http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-2482335412ffea65006-8000.html

EDIT: Vaya, veo que se está ejecutando en el dispositivo. Todavía probaría uno predeterminado y veré si puedes hacerlo funcionar, podría ayudar a reducir el problema.

EDIT 2: ¿Está implementando la interfaz FREExtension (en Java)? No veo eso en tu código publicado.

+0

No puedo verificar el código en este momento, pero estoy 99% seguro de que sí ... –

+1

Es difícil rastrear el problema sin mirarlo todo el código de Java, esa parte del código podría estar donde existe el error. Cuando pueda, recomendaría comparar eso con los documentos de Adobe para asegurarse de que esté inicializando correctamente el contexto. –

+0

Agregaré el bit faltante cuando tenga acceso al resto del código ... Lo dejé en la oficina ... Pero estoy bastante seguro de que está bien ... Preferiría pensar que debe haber algo mal con la configuración o la forma en que empaqueté todo ... –

3

La extensión más básica todavía incluye 2 clases.

que necesita para implementar la interfaz 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() 
{ 
} 
} 

Y a continuación, el contexto es la clase que tiene arriba:

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 clase en la extensión xml debe ser el primero en llegar, es decir, la implementación FREExtension.

Además, a menos que esté creando la versión para iPhone de esta extensión, debe eliminar el nodo de iPhone de su extensión.xml.

+1

Hago todas estas cosas ... mira mi código ... –

+1

Lo siguiente que debe verificar es que en realidad está empaquetando la extensión con su aplicación. Puede seguir algo como esto: http://labs.distriqt.com/post/815. Simplemente compruebe que tiene marcada la casilla de verificación "Paquete" para cada una de las plataformas de empaquetado de compilación. ¿Estás usando FB4.6? – Michael

7

Tuve exactamente el mismo problema. Mi ANE funcionaba bien en iOS, en el simulador, con la lib utilizada por defecto, pero no funcionaba en un dispositivo Android real (plataforma Android-ARM).

Y ExtensionContext.createExtensionContext() estaba regresando null.

Resultó que este problema es problema de versión de las herramientas, versión del compilador de Java. Estaba usando el último AIR (3.8), JDK (1.7.25), Android SDK (22.0.5) etc. No funcionó.

Pero después de agregar -target 1.6 a javac llamada, funcionó bien.

2

me hizo llegar el mismo problema antes y en realidad el problema no era la función createExtensionContext() en sí, sino la clase FREContext y la mayoría de las veces sucedió en los getFunctions Mapa públicas() método

Básicamente, por ejemplo, he declarado 3 FREFunctions a utilizar en mis FREContext como:

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) 

Así que cuando se inicializa el FREContext, esta voluntad de clase pasa por el constructor de cada función en el interior y si tengo algunas excepciones en algún lugar en el constructor de getVersion (), el FREContext se bloqueará y devolverá null de nuevo a createExtensionContext() La solución a este problema es si no está seguro de dónde obtiene la excepción, comente todos los FREfunction uno por uno para descubrir cuál causa la excepción. En su caso, dudo que el 2 variables

public LocationManager locationManager; 
    public LocationListener locationListener; 

son las causas de la excepción. Por favor coméntelos e inténtelo de nuevo. Otra cosa que puede ayudarlo mucho cuando construye el ANE es tratar de depurar el ANE de su ADT conectando el puerto actual de la aplicación AIR de Android al depurador de ADT. Puede obtener más información acerca de cómo depurar ANE de este artículo http://www.adobe.com/devnet/air/articles/ane-android-devices.html

Espero que ayude.

0

me encontré con el mismo problema cuando se trata de construir ANE-Video:

_context = ExtensionContext.createExtensionContext(EXTENSION_ID, null); 

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

He resuelto el problema al compilar con un 1,6 JDK 1.7 en lugar de un JDK (que se ejecuta en Mac OS X Mavericks).

This post ayudó a rodar temporalmente el JDK de nuevo a 1.6.

La idea provino de this Adobe article:

En este punto Adobe herramientas no es del todo compatible con Java 7 y es posible que encuentre errores en la vinculación y el tiempo de envasado.

+0

¿Por qué estabas pasando ** null ** en el parámetro? –

+1

Pasé 'null' porque esto indica que' contextType' no está especificado. Consulte la extensión de AdobeContext [docs] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExtensionContext.html#createExtensionContext()). –

Cuestiones relacionadas