2012-01-23 46 views
9

我工作的本机扩展的Android平台和我被困在ActionScript空扩展上下文...的Adobe AIR 3.1 Android原生扩展 -

瞄准了Android 2.1 ...在谷歌Nexus One测试(2.3 0.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

您有没有找到解决方案?我以前创建的ANE很好。今天,当我在制作新的时,我正在得到你的确切的错误。即使代码我做了几个月后,我没有改变任何东西... – brybam

回答

1

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

如果您正在运行的当前平台找不到ExtensionContext(例如:windows模拟器),则返回NULL,即使它可能在设备上正常运行。您可以在编译ANE时设置默认上下文,以便在未找到特定匹配的情况下使用。该默认目标可以完全在AS3中编写,对于伪造或处理不支持的设备很有用。

Adob​​e AIR文档包含有关包含默认实现的更多详细信息。看到这里:http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-2482335412ffea65006-8000.html

编辑:哎呀,我看你是在设备上运行。我仍然会尝试一个默认的,看看你是否可以得到这个工作,这可能有助于缩小问题的范围。

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

+0

我现在无法检查代码,但我99%肯定我做... –

+1

它很难追查没有看所有的问题在Java代码中,这部分代码可能是存在该错误的地方。当你可以的时候,我建议将它与Adobe的文档进行比较,以确保它正确地初始化上下文。 –

+0

当我有权访问其余的代码时,我将添加缺失的位...将它留在办公室......但我确信它没问题......我宁愿认为一定有什么问题与设置或我打包整个事情的方式... –

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

我做所有这些事情...看看我的代码... –

+1

接下来要检查的是,您实际上是将您的应用程序打包为扩展名。你可以按照这样的方式来操作:http://labs.distriqt.com/post/815。 只需检查您是否为每个构建包装平台勾选了“包装”复选框。 您使用的是FB4.6吗? – Michael

7

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

ExtensionContext.createExtensionContext()正在返回null

原来,这个问题是工具版本问题,Java编译器版本。我使用的是最新的AIR(3.8),JDK(1.7。25),Android SDK(22.0.5)等。它没有工作。

但添加-target 1.6javac调用后,它运行良好。

2

我先得到了同样的问题,其实这个问题是不是createExtensionContext()函数本身,而是类FREContext和大部分的方法公开地图getFunctions()happend

基本上,例如时间我宣布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

希望它有帮助。

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小牛运行)解决了这个问题。

This post帮助暂时将JDK回滚到1.6。

线索来自this Adobe article

此时的Adobe工具不与Java 7很好地兼容,你可以在连接和包装时间遇到错误。

+0

为什么你在参数中传递** null **? –

+1

我传递了'null',因为这表明'contextType'没有被指定。请参阅Adobe的ExtensionContext [docs](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExtensionContext.html#createExtensionContext())。 –