9

我正在为 Android 平台开发本机扩展,但我被卡住了......

以 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

}

}
4

5 回答 5

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通话后,它运行良好。

于 2013-08-02T19:56:10.333 回答
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 节点。

于 2012-01-24T22:14:37.343 回答
2

我之前确实遇到过同样的问题,实际上问题不是 createExtensionContext() 函数本身,而是 FREContext 类,并且大多数时候它发生在方法 public Map getFunctions()

基本上,例如,我已经声明了 3 个 FREFunction 以在我的 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一一注释掉,找出是哪一个导致了异常。在你的情况下,我怀疑这两个变量

  public LocationManager locationManager;
  public LocationListener locationListener;

是异常的原因。请把它们注释掉,然后再试一次。在构建 ANE 时可以帮助您很多的另一件事是尝试通过将当前 AIR android 应用程序的端口附加到 ADT 的调试器来从您的 ADT 调试 ANE。您可以从这篇文章http://www.adobe.com/devnet/air/articles/ane-android-devices.html了解有关如何调试 ANE 的更多信息

希望能帮助到你。

于 2014-04-04T00:21:21.167 回答
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 中)?我在您发布的代码中没有看到这一点。

于 2012-01-23T22:11:15.893 回答
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。

线索来自这篇 Adob​​e 文章

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

于 2014-09-25T17:41:18.740 回答