Note that there are some explanatory texts on larger screens.

plurals
  1. POFlex Mobile AIR Native Extension errors
    primarykey
    data
    text
    <p>I'm currently working on creating an Android ANE for native alert popups. I'm now at the point where I think my both my Java and AS3 code is good to go but I'm getting an error when I try to use it.</p> <p>Main Thread (Suspended: TypeError: Error #1009: Cannot access a property or method of a null object reference.) </p> <p>My problem is I'm really not sure where this error is coming from. My thinking is that I'm not building the ANE file correctly or something is wrong in my extension.xml file but I'm really not too sure.</p> <p>I'm going to try to provide as much information as I can about how this project is set up. Right now I'm trying to use this ANE in a small, testing application.</p> <p>First, the folder setup:</p> <pre> 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 </pre> <p>I'm not going to bother posting my java code as I think it's correct. but if anyone who is willing to invest some time in helping me with this issue wants to take a look please let me know.</p> <p>This is my extensions.xml file</p> <pre><code>&lt;extension xmlns="http://ns.adobe.com/air/extension/2.5"&gt; &lt;id&gt;com.fa.alerts&lt;/id&gt; &lt;versionNumber&gt;1.0&lt;/versionNumber&gt; &lt;platforms&gt; &lt;platform name="Android-ARM"&gt; &lt;applicationDeployment&gt; &lt;nativeLibrary&gt;AndroidAlert.jar&lt;/nativeLibrary&gt; &lt;initializer&gt;com.fa.ne.android.AlertExtension&lt;/initializer&gt; &lt;finalizer&gt;com.fa.ne.android.AlertExtension&lt;/finalizer&gt; &lt;/applicationDeployment&gt; &lt;/platform&gt; &lt;/platforms&gt; &lt;/extension&gt; </code></pre> <p>And this is my Alert.as file:</p> <pre><code>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); } } } </code></pre> <p>And this is my stub app I'm using to test</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView"&gt; &lt;fx:Script&gt; &lt;![CDATA[ protected function spawnAne(event:MouseEvent):void{ var a:Alert = new Alert(); Alert.androidAlert("test","testing"); } ]]&gt; &lt;/fx:Script&gt; &lt;fx:Declarations&gt; &lt;!-- Place non-visual elements (e.g., services, value objects) here --&gt; &lt;/fx:Declarations&gt; &lt;s:Button click="spawnAne(event)" /&gt; &lt;/s:View&gt; </code></pre> <p>Now clicking on that button is what causes the error.</p> <p>I don't have any kind of swc or link between my testing app and the AS3 Alert_AS project. I'm using Flash Builder 4.6 to import the ANE file using the IDE tools.</p> <p>To build my ANE I'm using a lightly modified bash script from this post: <a href="http://gotoandlearn.com/play.php?id=149" rel="nofollow">http://gotoandlearn.com/play.php?id=149</a> by Lee Brimelow</p> <pre><code># 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 *******" </code></pre> <p>I know this is a bit long but any help would be greatly appreciated! And feel free to let me know if you need some more elaboration</p> <p><strong>Added Java code</strong></p> <p>I modified the original code a bit. I removed AlertExtension.java and moved the get context function to AlertContext.java. I was thinking this would solve my issue but I'm still getting the same result. Here is my code:</p> <p>AlertContext.java, I'm assuming the createContext method is fired after var a:Alert = new Alert(); </p> <pre><code>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&lt;String, FREFunction&gt; getFunctions() { HashMap&lt;String, FREFunction&gt; functionMap = new HashMap&lt;String, FREFunction&gt;(); functionMap.put("showAlert", new ShowAlert()); return functionMap; } } </code></pre> <p>Here is my ShowAlert class</p> <pre><code>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; } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload