适用于Android的Adobe AIR 3.1 Native Extension - actionscript中的null扩展上下文

时间:2012-01-23 19:33:14

标签: java android actionscript-3 air air-native-extension

我正在开发适用于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

}

}

5 个答案:

答案 0 :(得分:7)

我有完全相同的问题。 我的ANE在iOS上运行良好,在模拟器上使用默认的lib,但是在实际的Android设备(Android-ARM平台)上没有工作。

ExtensionContext.createExtensionContext()正在返回null

事实证明,这个问题是工具版本问题,Java编译器版本。我使用的是最新的AIR(3.8),JDK(1.7.25),Android SDK(22.0.5)等。它没有用。

但是在将-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中编写,对于伪造或处理不支持的设备非常有用。

Adob​​e 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不完全兼容,您可能会在链接和打包时遇到错误。