Ошибки Flex Mobile AIR Native Extension - PullRequest
       62

Ошибки Flex Mobile AIR Native Extension

3 голосов
/ 12 декабря 2011

В настоящее время я работаю над созданием Android ANE для собственных всплывающих окон с предупреждениями.Сейчас я нахожусь в точке, где я думаю, что мой код на Java и AS3 хорош, но я получаю сообщение об ошибке при попытке его использовать.

Основной поток (Приостановлено: Ошибка типа: Ошибка #1009: Невозможно получить доступ к свойству или методу пустой ссылки на объект.)

Моя проблема в том, что я действительно не уверен, откуда эта ошибка.Я думаю, что я неправильно строю ANE-файл или что-то не так в моем файле extension.xml, но я действительно не слишком уверен.

Я собираюсь попытаться предоставить столько информации, сколькоЯ могу о том, как этот проект настроен.Прямо сейчас я пытаюсь использовать этот ANE в небольшом тестирующем приложении.

Во-первых, настройка папки:

ANEextensions-

     Alert_Java (holding my Java project)

          (Android/Java created assets. Not sure if these are important or now. If so I will list them)

          src

               com

                    fa

                         ne                        

                              android

                                   AlertContext.java

                                   AlertExtension.java

                                   ShowAlert.java

     Alert_AS

          bin

               AlertAndroidAS.swc

          src

               Alert.as

               extension.xml

Я не собираюсь размещать свой код Java какЯ думаю, что это правильно.но если кто-то, кто хочет потратить некоторое время на помощь мне в этом вопросе, хочет взглянуть, пожалуйста, дайте мне знать.

Это мой файл extensions.xml

<extension xmlns="http://ns.adobe.com/air/extension/2.5">

<id>com.fa.alerts</id>

<versionNumber>1.0</versionNumber>

    <platforms>

        <platform name="Android-ARM">

            <applicationDeployment>

                <nativeLibrary>AndroidAlert.jar</nativeLibrary>

                <initializer>com.fa.ne.android.AlertExtension</initializer>

                <finalizer>com.fa.ne.android.AlertExtension</finalizer>

            </applicationDeployment>

        </platform>

    </platforms>

</extension>

И этомой файл Alert.as:

package {

    import flash.events.EventDispatcher;

    import flash.external.ExtensionContext;



    public class Alert extends EventDispatcher{

        public static var extContext:ExtensionContext = null

        public function Alert(){

            super();



            extContext = ExtensionContext.createExtensionContext("com.fa.alerts", null);



        }



        public static function androidAlert(aTitle:String, aMsg:String, aNeg:String = "Cancel", aPos:String = "Ok"):void{

            extContext.call("showAlert", aTitle, aMsg, aNeg, aPos);

        }

    }

}

И это мое приложение-заглушка, которое я использую для проверки

<?xml version="1.0" encoding="utf-8"?>

<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 

        xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView">



    <fx:Script>

        <![CDATA[



            protected function spawnAne(event:MouseEvent):void{



                var a:Alert = new Alert();

                Alert.androidAlert("test","testing");

            }

        ]]>

    </fx:Script>



    <fx:Declarations>

        <!-- Place non-visual elements (e.g., services, value objects) here -->

    </fx:Declarations>

    <s:Button click="spawnAne(event)" />

</s:View>

Теперь нажатие на эту кнопку вызывает ошибку.

У меня нет никакого swc или ссылки между моим тестовым приложением и проектом AS3 Alert_AS.Я использую Flash Builder 4.6 для импорта файла ANE с помощью инструментов IDE.

Для создания своего ANE я использую слегка модифицированный скрипт bash из этого поста: http://gotoandlearn.com/play.php?id=149 от Lee Brimelow

# path to YOUR Android SDK
export AIR_ANDROID_SDK_HOME="my sdk"

# path to the ADT tool in Flash Builder sdks
ADT="my adt"

# native project folder
NATIVE_FOLDER=Alert_Java

# AS lib folder
LIB_FOLDER=Alert_AS

# name of ANE file
ANE_NAME=AndroidAlert.ane

# JAR filename
JAR_NAME=AndroidAlert.jar


# cert path
CERT_NAME=cert.p12

# cert password
CERT_PASS=password

#===================================================================

echo "****** preparing ANE package sources *******"

rm ${ANE_NAME}
rm -rf ./build/ane
mkdir -p ./build/ane
mkdir -p ./build/ane/Android-ARM
mkdir -p ./build/ane/Android-ARM/res

# copy resources
cp -R ./${NATIVE_FOLDER}/res/* ./build/ane/Android-ARM/res

# create the JAR file
jar cf ./build/ane/Android-ARM/${JAR_NAME} -C ./${NATIVE_FOLDER}/bin .

# grab the extension descriptor and SWC library 
cp ./${LIB_FOLDER}/src/extension.xml ./build/ane/
cp ./${LIB_FOLDER}/bin/*.swc ./build/ane/
unzip ./build/ane/*.swc -d ./build/ane
mv ./build/ane/library.swf ./build/ane/Android-ARM


echo "****** creating ANE package *******"

"$ADT" -package -storetype PKCS12 -keystore ./cert.p12 -storepass password -tsa none \
    -target ane \
    ${ANE_NAME} \
    ./build/ane/extension.xml \
    -swc ./build/ane/*.swc \
    -platform Android-ARM \
    -C ./build/ane/Android-ARM/ .

echo "****** ANE package created *******"

Я знаю, что это немного долго, но любая помощь будет принята с благодарностью!И не стесняйтесь, дайте мне знать, если вам нужна дополнительная проработка

Добавлен код Java

Я немного изменил исходный код.Я удалил AlertExtension.java и переместил функцию получения контекста в AlertContext.java.Я думал, что это решит мою проблему, но я все еще получаю тот же результат.Вот мой код:

AlertContext.java, я предполагаю, что метод createContext запускается после var a: Alert = new Alert ();

package com.fa.ne.android;

import java.util.Map;
import java.util.HashMap;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension;
import com.adobe.fre.FREFunction;

public class AlertContext extends FREContext implements FREExtension {

@Override
public FREContext createContext(String type){
    return new AlertContext();
}

@Override
public void initialize(){

}
@Override
public void dispose() {

}

@Override
public Map<String, FREFunction> getFunctions() {

    HashMap<String, FREFunction> functionMap = new HashMap<String, FREFunction>(); 
    functionMap.put("showAlert", new ShowAlert());
    return functionMap;
}




}

Вот мой класс ShowAlert

package com.fa.ne.android;

import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREInvalidObjectException;
import com.adobe.fre.FREObject;
import com.adobe.fre.FRETypeMismatchException;
import com.adobe.fre.FREWrongThreadException;


public class ShowAlert implements FREFunction {

@Override
public FREObject call(FREContext aContext, FREObject[] aPassedArgs) {
    //get activity
    Activity a = aContext.getActivity();
    //grabbing context
    final FREContext context = aContext; 
    try{
        //getting the title and msg for alert as string
        String title = aPassedArgs[0].getAsString();
        String message = aPassedArgs[1].getAsString();
        String negitive = aPassedArgs[3].getAsString();
        String positive = aPassedArgs[4].getAsString();
        //creating the alert builder with the activity
        Builder builder = new Builder(a);
        //setting the title and msg
        builder.setTitle(title);
        builder.setMessage(message);
        //setting up buttons, negative and positive, each with an event so we can listen in AS3
        //doing listeners inline
        builder.setNegativeButton(negitive, new OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int dig){
                context.dispatchStatusEventAsync("nativeAlert", "negitive");
            }

        }).setNeutralButton(positive, new OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int dig){
                context.dispatchStatusEventAsync("positiveAlert", "positive");
            }
        });
        //done building, time to alert and return
        builder.create().show();

        return FREObject.newObject(true);

        //error handeling
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (FRETypeMismatchException e) {
        e.printStackTrace();
    } catch (FREInvalidObjectException e) {
        e.printStackTrace();
    } catch (FREWrongThreadException e) {
        e.printStackTrace();
    }

    return null;
}

}

Ответы [ 4 ]

1 голос
/ 12 декабря 2011

Быстрый совет, создайте функцию, которая сообщит вам, доступно ли расширение.

public static function isSupported():Boolean
{
     return extContext != null;
}

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

Также хорошо добавить стандартную реализацию собственного расширения., который может быть полностью прописан в скрипте действий и будет использоваться при запуске приложения в эмуляторе.

Для получения дополнительной информации смотрите здесь:

http://www.adobe.com/devnet/air/articles/extending-air.html

0 голосов
/ 23 мая 2012

Я тоже продолжал сталкиваться с вашей проблемой.

Единственный учебник, который мне удалось получить (с некоторыми изменениями), был найден здесь.

http://www.adobe.com/devnet/air/articles/developing-native-extensions-air.html

Мне пришлось добавить -swf-version 13 в компилятор библиотеки flex.

И мне пришлось добавить -tsa none в команду adt, чтобы построить ANE-файл.

0 голосов
/ 06 мая 2012

Я не могу ответить на ваш вопрос.Я не знаю Java (он читается как псевдо-ActionScript для меня хе-хе-хе).Тем не менее, это может предложить вам некоторую помощь и кого-то, кого вы могли бы отослать сюда, и который мог бы легко определить проблему.

Петр Валчишин создал собственное расширение для оповещения / отправки Android здесь: http://www.riaspace.com/2011/09/as3c2dm-air-native-extension-to-push-notifications-with-c2dm/

комментарии Я также нашел другого человека с обширным учебником для собственных предупреждений в iOS здесь: http://www.liquid -photo.com / 2011/10/28 / native-extension-for-adobe-air-and-ios-101/

Я читал комментарии к сообщению Петра, и некоторые его слова заставляют меня задуматься, может ли эта строка

extContext = ExtensionContext.createExtensionContext("com.fa.alerts", null);

вызывать / иметь отношение к проблеме

Надеюсь, что это может помочь вам и / или другим.

Всем удачи!

Тодд

... назад к исследованию параметров push-уведомлений / жизнеспособности = D

0 голосов
/ 05 марта 2012

Связали ли вы расширение с платформой Android во FlashBuilder?Недостаточно просто добавить его на вкладку NativeExtension в разделе «Путь сборки Flex». Также необходимо установить флажок в

«Упаковка сборки Flex» >> «Google Andorid» >> «Собственное расширение»

Также Вы можете попытаться взглянуть на разницу, и Мэйби что-то поможет из моей статьи: NativeAlert

...