java - Extensión nativa de Adobe AIR 3.1 para Android: contexto de extensión nulo en actionscript
actionscript-3 air-native-extension (5)
Estoy trabajando en Native Extension para la plataforma Android y me quedé atascado ...
Orientación de 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 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>
ese es mi comando de 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, la extensión es realmente simple ... solo estoy tratando de devolver el valor de cadena 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
}
}
¿De dónde sacas la referencia NULL? ¿Se está ejecutando en el dispositivo o en el simulador de AIR?
Si ExtensionContext no se puede encontrar para la plataforma actual en la que se está ejecutando (por ejemplo: Windows Simulator) 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 cómo incluir una implementación predeterminada. Vea aquí: http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-2482335412ffea65006-8000.html
EDITAR: 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.
La extensión más básica todavía incluye 2 clases.
Debe 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 luego el contexto es la clase que tienes 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 debería ser la primera aquí, 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 iPhone de su archivo extension.xml.
Tuve exactamente el mismo problema. Mi ANE funcionaba bien en iOS, en simulador, con la lib predeterminada utilizada, pero no funcionaba en un dispositivo Android real (plataforma Android-ARM).
Y ExtensionContext.createExtensionContext()
devolvía null
.
Resultó que este problema es problema de versión de herramientas, versión del compilador de Java. Estaba usando la última versión de AIR (3.8), JDK (1.7.25), Android SDK (22.0.5), etc. No funcionó.
Pero después de agregar el objetivo -target 1.6
a la llamada javac
, funcionó bien.
Obtuve el mismo problema antes y en realidad el problema no fue la función createExtensionContext () en sí, sino la clase FREContext y la mayoría de las veces que pasó en el método public Map getFunctions ()
Básicamente, por ejemplo, he declarado 3 FREFunctions para usar en mi 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)
Entonces, cuando FREContext se inicializa, esta clase pasará por el constructor de cada función en el interior y si obtuve algunas excepciones en algún lugar del constructor de la función getVersion (), FREContext se bloqueará y devolverá null para crearExtensionContext (). La solución a este problema es si no está seguro de dónde obtiene la excepción, comente todas sus FREfunction una por una para descubrir cuál causa la excepción. En tu caso, dudo las 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 ayudarte mucho cuando construyes el ANE es tratar de depurar el ANE desde tu 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 en este artículo http://www.adobe.com/devnet/air/articles/ane-android-devices.html
Espero eso ayude.
Me encontré con el mismo problema al tratar de construir ANE-Video :
_context = ExtensionContext.createExtensionContext(EXTENSION_ID, null);
// _context is set to null, with no other error info
Resolví el problema compilando con un 1.6 JDK en lugar de un 1.7 JDK (ejecutándose en Mac OS X Mavericks).
Esta publicación ayudó a revertir temporalmente el JDK a 1.6.
La clave vino de este artículo de Adobe :
En este punto, las herramientas de Adobe no son del todo compatibles con Java 7 y es posible que se produzcan errores en el tiempo de vinculación y empaquetamiento.