Собственное расширение Adobe AIR 3.1 для Android - нулевой контекст расширения в ActionScript - PullRequest
9 голосов
/ 23 января 2012

Я работаю над Native Extension для платформы 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

}

}

Ответы [ 5 ]

7 голосов
/ 02 августа 2013

У меня была точно такая же проблема. Мой 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 все заработало.

3 голосов
/ 25 января 2012

Самое основное расширение все еще включает 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, вы должны удалить узел iPhone из файла extension.xml.

2 голосов
/ 04 апреля 2014

Я и раньше сталкивался с той же проблемой, и на самом деле проблема была не в самой функции 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 завершится сбоем и вернет нуль обратно в createExtensionContext (). Решение этой проблемы заключается в том, что если вы не уверены, где вы получили исключение, закомментируйте все функции FREFunction один за другим, чтобы выяснить, какая из них вызывает исключение. В твоем случае я сомневаюсь в 2 переменных

  public LocationManager locationManager;
  public LocationListener locationListener;

являются причинами исключения. Пожалуйста, прокомментируйте их и попробуйте снова. Еще одна вещь, которая может помочь вам при создании ANE, - это попытка отладки ANE из вашего ADT, подключив порт текущего Android-приложения AIR к отладчику ADT. Вы можете узнать больше о том, как отлаживать ANE из этой статьи http://www.adobe.com/devnet/air/articles/ane-android-devices.html

Надеюсь, это поможет.

1 голос
/ 24 января 2012

Где вы получаете 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)? Я не вижу этого в вашем опубликованном коде.

0 голосов
/ 25 сентября 2014

Я столкнулся с той же проблемой при попытке собрать ANE-Video :

_context = ExtensionContext.createExtensionContext(EXTENSION_ID, null);

// _context is set to null, with no other error info

Я решил проблему, скомпилировав JDK 1.6 вместо 1.7 JDK (работает на Mac OS X Mavericks).

Эта запись помогла временно откатить JDK до 1.6.

Подсказка пришла от этой статьи Adobe :

На данный момент инструменты Adobe не совсем совместимы с Java 7, и вы можете столкнуться с ошибками при компоновке и упаковке.

...