I'm working on Native Extension for Android platform and i got stuck...
Targeting Android 2.1... testing on Google Nexus One (2.3.6)
this line returns NULL
this.context = ExtensionContext.createExtensionContext("com.company.ane.LocationManager", "");
this is extension descriptor file:
<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>
that is my package command:
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
At this stage extension is really simple... i'm just trying to return string value back to my 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
}
}
Where are you getting the NULL reference? Is this running on device or in the AIR simulator?
If ExtensionContext can not be found for the current platform you are running on (eg: windows simulator) NULL is returned, even though it might run fine on the device. You can setup a default context when compiling the ANE that would be used where ever specific match is not found. This default target can be written entirely in AS3, and is useful for faking or handling unsupported devices.
The Adobe AIR documentation has more details on including a default implementation. See here: http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-2482335412ffea65006-8000.html
EDIT: Whoops, I see you are running on device. I'd still try a default one and see if you can get that working, it might help narrow down the problem.
EDIT 2: Are you Implementing the FREExtension interface (in Java)? I don't see that in your posted code.