Ошибки Flex Mobile AIR Native Extension
В настоящее время я работаю над созданием Android ANE для собственных всплывающих окон с предупреждениями. Сейчас я нахожусь в точке, где я думаю, что мой код на Java и AS3 хорош, но я получаю ошибку, когда пытаюсь его использовать.
Основной поток (Приостановлено: Ошибка типа: Ошибка № 1009: Невозможно получить доступ к свойству или методу пустой ссылки на объект.)
Моя проблема в том, что я действительно не уверен, откуда эта ошибка. Я думаю, что я неправильно строю ANE-файл или что-то не так в моем файле extension.xml, но я действительно не слишком уверен.
Я постараюсь предоставить как можно больше информации о том, как устроен этот проект. Прямо сейчас я пытаюсь использовать этот ANE в небольшом тестируемом приложении.
Во-первых, настройка папки:
ANEextensions- Alert_Java (держит мой Java-проект) (Ресурсы, созданные в Android/Java. Не уверены, важны ли они или сейчас. Если да, я перечислю их) ЦСИ ком фа Небраска андроид AlertContext.java AlertExtension.java ShowAlert.java Alert_AS бункер AlertAndroidAS.swc ЦСИ 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 ответа
Быстрый совет, создайте функцию, которая сообщит вам, доступно ли расширение.
public static function isSupported():Boolean
{
return extContext != null;
}
Надеюсь это поможет.
Также хорошо добавить реализацию по умолчанию собственного расширения, которое может быть полностью описано в скрипте действий и будет использоваться при запуске приложения в эмуляторе.
Для получения дополнительной информации смотрите здесь:
Вы связали расширение с платформой Android во FlashBuilder? Просто добавить его на вкладку NativeExtension в "Flex Build Path" недостаточно. Вы также должны установить флажок в
"Flex Build Packaging" >> "Google Andorid">> "Собственное расширение"
Также Вы можете попытаться взглянуть на разницу, и Мэйби что-то поможет из моей статьи: NativeAlert
Я продолжал сталкиваться с твоей проблемой тоже.
Единственный учебник, который мне удалось получить (с некоторыми изменениями), был найден здесь.
http://www.adobe.com/devnet/air/articles/developing-native-extensions-air.html
Я должен был добавить -swf-version 13
к компилятору библиотеки Flex.
И мне пришлось добавить -tsa none
к команде adt, чтобы построить файл ANE.
Я не могу ответить на твой вопрос. Я не знаю 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