我正在开发适用于Android平台的Native Extension,但我被卡住了......
针对Android 2.1 ...在Google Nexus One(2.3.6)上进行测试
此行返回NULL
this.context = ExtensionContext.createExtensionContext("com.company.ane.LocationManager", "");
这是扩展描述符文件:
<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>
这是我的包命令:
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
在这个阶段,扩展非常简单......我只是想将字符串值返回给我的应用程序......
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 :(得分:7)
我有完全相同的问题。 我的ANE在iOS上运行良好,在模拟器上使用默认的lib,但是在实际的Android设备(Android-ARM平台)上没有工作。
ExtensionContext.createExtensionContext()
正在返回null
。
但是在将-target 1.6
添加到javac
电话后,它运作良好。
答案 1 :(得分:3)
最基本的扩展程序仍包含2个类。
您需要实现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()
{
}
}
然后上下文就是你上面的课程:
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;
}
}
扩展xml中的类应该是第一个,即FREExtension实现。
除非您要创建此扩展程序的iPhone版本,否则应从extension.xml中删除iPhone节点。
答案 2 :(得分:2)
之前我确实得到了同样的问题,实际上问题不是createExtensionContext()函数本身,而是类FREContext,大多数情况下它发生在方法public Map getFunctions()
基本上,例如我已经在我的FREContext中声明了3个FREFunctions,如:
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)
因此,当初始化FREContext时,此类将遍历每个函数内部的构造函数,如果我在getVersion()函数的构造函数中的某处出现异常,则FREContext将崩溃并将null返回给createExtensionContext()。 这个问题的解决方案是,如果您不确定从何处获得异常,请逐一注释掉所有FREFunction,以找出导致异常的因素。 在你的情况下,我怀疑2变量
public LocationManager locationManager;
public LocationListener locationListener;
是异常的原因。请将它们评论出来并再试一次。 在构建ANE时可以帮助你的另一件事是尝试通过将当前AIR android应用程序的端口附加到ADT的调试器来从ADT调试ANE。您可以从本文http://www.adobe.com/devnet/air/articles/ane-android-devices.html
中了解有关如何调试ANE的更多信息希望它有所帮助。
答案 3 :(得分:1)
你在哪里获得NULL引用?这是在设备上还是在AIR模拟器中运行?
如果找不到您正在运行的当前平台的ExtensionContext(例如:windows simulator),则返回NULL,即使它可能在设备上正常运行。您可以在编译将在未找到特定匹配时使用的ANE时设置默认上下文。此默认目标可以完全在AS3中编写,对于伪造或处理不支持的设备非常有用。
Adobe AIR文档提供了有关包含默认实现的更多详细信息。见这里:http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-2482335412ffea65006-8000.html
编辑:哎呀,我看到你在设备上运行了。我仍然会尝试使用默认设置,看看你是否可以使用它,这可能有助于缩小问题范围。
编辑2:您是否正在实现FREExtension接口(使用Java)?我在你发布的代码中没有看到。
答案 4 :(得分:0)
我在尝试构建ANE-Video时遇到了同样的问题:
_context = ExtensionContext.createExtensionContext(EXTENSION_ID, null);
// _context is set to null, with no other error info
我通过使用1.6 JDK而不是1.7 JDK(在Mac OS X Mavericks上运行)进行编译来解决问题。
This post帮助暂时将JDK推回到1.6。
线索来自this Adobe article:
此时Adobe工具与Java 7不完全兼容,您可能会在链接和打包时遇到错误。