Adobe AIR 3.1针对Android的本地扩展 - 在ActionScript中出现null扩展上下文

9
我正在为安卓平台开发本地扩展,但遇到了困难...目标是安卓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

}

}

你曾经找到解决方案了吗?我之前创建的 ANE 是好的。今天我制作新的时候,却得到了你的确切错误。即使是几个月前的代码,我也没有更改任何内容... - brybam
5个回答

7
我遇到了完全相同的问题。我的ANE在iOS上使用默认库在模拟器上运行良好,但在实际的Android设备(Android-ARM平台)上却无法工作。 ExtensionContext.createExtensionContext()返回了null
原来这个问题是工具版本问题,Java编译器版本问题。我使用的是最新的AIR(3.8),JDK(1.7.25),Android SDK(22.0.5)等,但都无法工作。
但是在javac调用中添加-target 1.6后,它就可以正常工作了。

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节点。

1
下一步要检查的是您是否将扩展程序与应用程序打包在一起。您可以按照以下步骤进行:http://labs.distriqt.com/post/815。只需检查每个构建打包平台的“Package”复选框是否已选中。您是否使用FB4.6? - Michael

2

我以前遇到过同样的问题,实际上问题不在于createExtensionContext()函数本身,而是FREContext类,大部分情况下出现在public Map getFunctions()方法中。

基本上,例如我已经声明了3个FREFunctions来在我的FREContext中使用:

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。您可以从本文了解更多关于如何调试ANE:http://www.adobe.com/devnet/air/articles/ane-android-devices.html

希望它能有所帮助。


1

你在哪里得到了NULL引用?这是在设备上运行还是在AIR模拟器中运行?

如果ExtensionContext在当前平台上找不到(例如:Windows模拟器),将返回NULL,即使它在设备上运行良好。您可以在编译ANE时设置默认上下文,该上下文将在未找到特定匹配项的任何地方使用。此默认目标可以完全使用AS3编写,并且对于伪造或处理不受支持的设备非常有用。

Adobe AIR文档详细介绍了包含默认实现的更多细节。请参见此处:http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-2482335412ffea65006-8000.html

编辑:糟糕,我看到你正在设备上运行。我仍然会尝试一个默认值并查看是否可以使其工作,这可能有助于缩小问题范围。

编辑2:您是否正在实现FREExtension接口(在Java中)?我在您发布的代码中没有看到它。


1
如果不查看所有Java代码,很难追踪问题,该部分代码可能是错误存在的地方。建议您在可以的情况下将其与Adobe文档进行比较,以确保正确初始化上下文。 - Tyler Egeto
当我可以访问其余代码时,我会添加缺失的部分...我把它留在办公室了...但我非常确定它没问题...我认为设置或打包整个项目的方式可能有问题... - tszarzynski
如果我在模拟器中测试,加载“默认”扩展名是正常情况吗? - tszarzynski
我也遇到了同样的问题。已经搜索了两天,但是没有找到任何解决方案。 - ketan
你使用的Air SDK版本是什么?我之前也遇到了相同的问题,直到我从这里下载了最新的SDK:https://helpx.adobe.com/air/kb/archived-air-sdk-version.html - IgorGanapolsky
显示剩余2条评论

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上运行)进行编译来解决了这个问题。

这篇文章帮助我暂时将JDK回滚到1.6。

线索来自这篇Adobe文章

目前,Adobe工具与Java 7不完全兼容,您可能会在链接和打包时遇到错误。


你为什么在参数中传递了 null - IgorGanapolsky
1
我传递了 null,因为这表示未指定 contextType。请参阅 Adobe 的 ExtensionContext 文档 - low-belly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接