Saturday, November 5, 2011

AIR for Android using external jar files in an extension

If you use a third-party jar file (i.e. not part of the regular Android SDK), you have to merge that jar into your own extension jar file.

For example, suppose your main extension jar file is extension.jar and you are using code in external.jar. Then you can put the classes from external.jar into extension.jar using the Java jar tool:

jar -xf external.jar

This will extract the .class files into package folders. If the top-level package is "com", then you can add those to extension.jar with:

jar -uf extension.jar com 

Tuesday, October 18, 2011

Custom text entry in AIR for iOS

On Android, you can create your own text entry controls using the InteractiveObject class and the needsSoftKeyboard and requestSoftKeyBoard() APIs. This doesn't work on iOS for various reasons. However, with some recent changes to the runtime, it is now possible to fake it.

Instead of using an InteractiveObject, you use an off screen TextField object to control the soft keyboard and to get the text as it is typed.

Code below the break...

Tuesday, October 4, 2011

AIR extensions in Java -- FREBitmapData

The following function takes an FREBitmapData as an argument, creates a new copy and returns it. It isn't very useful, except how to demonstrate passing bitmap data back and forth.

Pay attention to the acquire() and release() calls on FREBitmapData objects. When you have called it on one object, you CANNOT call any methods that are backed by an ActionScript object of ANY object. This includes creating new FREObjects (including FREBitmapData, FREByteArray, and FREArray), getProperty(), setProperty(), or callMethod(). As the words in all caps indicate, I found this rather surprising. You might too. So acquire, do it, then release. If you fail to release, say you hit an exception, then the extension gets into an invalid state. Hence, I release the bitmaps in a finally block. I imagine that this can be inconvenient in more complex functions.

Monday, October 3, 2011

AIR extensions in Java for Android Part 5 -- debugging the Java code

I'm sure there's more than one way to do it. This is just one way, using Eclipse/Flash Builder and the Android DDMS plug-in. I've tried the following on a Mac, but haven't tried on a PC yet.

AIR extensions in Java Part 4 -- using the extension

To use the extension, you reference the ANE file the same way you reference a SWC. Flash Builder 4.5.6 lets you include ANE files using the project dialog (there's a new category for ANEs). So if you have 4.5.6, you are set. If not, you'll have to do it manually.

AIR extensions in Java for Android Part 1 -- Creating the Java code

To create the Java part of an AIR native extension, you implement the FREExtension interface, create a context class extending FREContext, and create one or more functions by implementing the FREFunction interface. Along the way, you'll become friendly with the FREObject class. Finally, you export the code as a Jar file.

AIR extensions in Java for Android Part 2 -- Creating the ActionScript part

Now that we have a JAR file containing the "native" Android code, we can create the ActionScript code that goes with it. The ActionScript part of the extension serves as a go-between between the Java code and the AIR application.

The ActionScript part of an extension is an ordinary library class. The only unique part of it is that to access the native code, it creates a ExtensionContext object. The library class uses this extension context object to call functions in the Java part of the extension.

In addition, to the Java JAR file and the ActionScript library, a native extension includes an extension descriptor file. This descriptor is used by the ExtensionContext code in the runtime to look up the proper Java classes.