Can someone tell me what I'm doing wrong when you create a native extension for iPad? (Very detailed)

My company is developing a game for iPhone and iPad using Flash cs5.5 and Air3.0

The customer requires that certain features be supported - these things as GameCenter, rating, etc... which none are currently supported by flash for the iOS.

However, they provide us with a bunch of xCode example files on how they want things to work.

My idea was to bridge the gap in functionality by creating a native extension using the xcode source that was given to me, giving me the required functionality.

But first, I need to truly CREATE a native extension, even just a base echo/hello everyone... I followed all the steps of various guides and tutorials and I have managed to create an ipa and put it on my iPad 2 to test, but when the program starts, nothing happens, I find myself with a black screen. When I comment on the lines of code that initialize the extension, it fires just fine.

(and Yes, I even tried to put things in try blocks where there was a mistake - no luck)

So I hope that someone can read through the process of what I do below and point out what I am doing wrong, or what Miss me.

What I use:

Mini Mac running OS x 10.7.2 - this is used to run xCode 4.1 build 4B 110

PC - Windows 7 home 64 bit - running Flash CS5.5 (version 11.5.1.3469) with the 3.0 SDK inside AIR. I also have the sdk 3.0 air in a separate file for the command-line running. (This is my primary development platform)

The PC has flash builder installed, but I've never really used it, and I don't know how to use it... everything that has been built to date has been done using Flash CS5.5

So, here's what I did.

The first thing we do is to create a library static .a on mac.

I open xcode and create a new project.

  • Select iOS framework and library, then select "Cocoa touch static library.
  • Give it a name, in this case "EchoExtension" and put it in a folder.
  • I then delete the file EchoExtension.h as all the samples I've seen so far do not use.
  • I then add 'FlashRuntimeExtension.h' to the project of the AIR3.0 sdk frameworks folder on my PC
  • I remove everything in my folder ".m", and then, next to several different examples and tutorials, type the following code:

//

EchoExtension.m

EchoExtension

//

#include "FlashRuntimeExtensions.h".

Echo FREObject (FREContext ctx, void * funcData, uint32_t argc, {FREObject argv)

return argv [0];

}

//----------- Extention intializer and finalizer ----------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------ -

A native context instance is created

void ContextInitializer (void * extData, const uint8_t * ctxType, FREContext ctx, uint32_t * numFunctionsToTest, const FRENamedFunction * functionsToSet) {}

Configure the number of functions in this extention

for ease of reference, set the number of function that will use this extension.

int FunctionCount = 1;

set the number of function pointer reference that will use this extention.

* numFunctionsToTest = FunctionCount;

create an array to store all the functions that we will use.

FRENamedFunction * func = (FRENamedFunction *) malloc (sizeof (FRENamedFunction) * FunctionCount);

create a table for each function entry

Func [0] .name = (const uint8_t *) "echo"; the name of the function

Func [0] .functionData = NULL;                    the data type

Func [0] .function = & echo;             the reference to the real function

Save the array to a pointer.

* functionsToSet = func;

}

A native context instance is deleted

void ContextFinalizer (FREContext ctx) {}

return;

}

Initialization of each extension function

void ExtInitializer (void * extDataToSet, ctxInitializerToSet FREContextInitializer *, FREContextFinalizer * ctxFinalizerToSet) {}

* extDataToSet = NULL;

* ctxInitializerToSet = & ContextInitializer;

* ctxFinalizerToSet = & ContextFinalizer;

}

Called when the extension is unloaded

void ExtFinalizer (void * extData) {}

return;

}

  • I'll then 'product', 'building' and it creates libEchoExtension.a
  • I'm copying this .to file on my PC.

I am now finished with this abandoned mac of God (* shudder *)
Back on my PC, I create a folder for my test project. For all the intentions a purposes, we will call this "D:\src\EchoExtension" then I create 2 folders, one called "lib" and one called "app". Lib, it's where I'm going to create the actionscript source for my extension.

  • In my lib folder, I create a new fla in flash cs5.5, called "EchoExtension.fla".
  • I create my lib folder, the following:
    • com\extensions\EchoExtension\EchoExtension.as
    • a folder named 'Build' in which I place my libEchoExtension.a file.
  • I have in my EchoExtension.as file, place the following code:

package com.extensions.EchoExtension

{

import flash.events.EventDispatcher;

import flash.events.IEventDispatcher;

import flash.external.ExtensionContext;

SerializableAttribute public class EchoExtension extends EventDispatcher

{

protected var _extensionContext:ExtensionContext;

/**

* Constructor.

*/

public void EchoExtension()

{

Super();

Initialize the extension.

_extensionContext = ExtensionContext.createExtensionContext ("com.extensions.EchoExtension", "main");

}

public void echo(Prompt:String):String

{

Return _extensionContext.call ("echo") as String;

}

}

}

  • In my main fla, on the first layer of the time line, I put just the following code to make sure that did get file included when I publish the swc.

import com.extensions.EchoExtension.EchoExtension;

var ext:EchoExtension = new EchoExtension();

Stop();

  • I then opened upwards from my fla publication settings, disable the swf - which I don't need, and check the swc and ensure it generates in my generation folder.  «. "/ Build/EchoExtension.swc.
  • I also updated the player Air 3.0 (which I can do because I managed integrated AIR 3.0 along side my AIR 2.6 and can build both without any problem)
  • I then publish the swc. So far so good. No problems.
  • I then made a copy of the CFC and rename it to EchoExtension.swc.zip, how I extracted the library.swf file and place it in the folder of my generation.
  • I then create extension.xml in case of generation that contains the following code:

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

com.extensions.EchoExtension < id > < /ID >

< versionNumber > 1 < / versionNumber >

<>platforms

< platform name 'iPhone-ARMS' = >

< applicationDeployment >

< nativeLibrary > libEchoExtension.a < / nativeLibrary >

< initializer > ExtInitializer < / initializer >

< finalizer > ExtFinalizer < / finalizer >

< / applicationDeployment >

< / platform >

< / platforms >

< / extension >

  • Now, at this point, I'm a little suspicious, because I build for the iPad2... the platform is iPhone... I thought that may be a problem and at some point I have tested the same build on the iPhone4 and had the same results. I also tested using the name of the platform of the iPad-ARM and got the same results... So I don't think that's the problem, but I'm not sure.
  • Now, to make things easier, I created a batch file called "buildane.bat" in my file generation. That's what I use to create my .ane file and it contains the following command line:

D:\SDKs\AirSDK30\bin\adt-Paquet - target ane EchoExtension.ane extension.xml - CFC EchoExtension.swc - iPhone-ARM library.swf libEchoExtension.a platform

  • I then open a command prompt and run buildane.bat and Ottoman. My donkey is created. My generation file now has the following files in it:
      • buildane.bat
      • EchoExtension.ane
      • EchoExtension.swc
      • EchoExtension.swc.zip
      • extension. XML
      • libEchoExtension.a
      • Library.swf

Now that I have my swc, donkey and it's time to create my sample application that will be used to test my new extension.

  • I go back to my D:\src\EchoExtension folder and go to the folder app ealier, I created.
  • I then create a new flash project called EchoExtensionTester.fla
  • I open the action script settings, paths to library and add the CFC I created in my D:\src\EchoExtension\lib\build file to my project.
  • On my stage, I create a field called text txtInput, a field of dynamic text named txtEcho, and a couple of buttons called btnClear, btnRuntime and btnEcho
  • I open the first layer of the timeline, and place the following code:

imports of base.

import flash.desktop.NativeApplication;

import flash.events.MouseEvent;

import flash.text.TextField;

import the extension of our swc.

import com.extensions.EchoExtension.EchoExtension;

the value of our input text to the need the softkeyboard field

txtInput.needsSoftKeyboard = true;

Add event handlers to our buttons.

btnEcho.addEventListener (MouseEvent.CLICK, btnEcho_Click);

btnClear.addEventListener (MouseEvent.CLICK, btnClear_Click);

btnRunTime.addEventListener (MouseEvent.CLICK, btnRunTime_Click);

create our variable expansion.

var ext:EchoExtension;

Try

{

initialize our extension of echo.

Ext = new EchoExtension();

} catch (error) {}

txtEcho.text = 'Error when trying to create new EchoExtension:\n\n' + e;

}

Stop();

Delete the text echo field

function btnClear_Click(e:MouseEvent):void

{

txtEcho.text = "";

}

just to test, put the latest version of the air runtime in our text field, so we can make sure we run air 3.0

function btnRunTime_Click(e:MouseEvent):void

{

txtEcho.text += "\nRuntime version =" + NativeApplication.nativeApplication.runtimeVersion; ".

}

call the extension, passing all that is in the text input field and get back and place it in our text echo field

function btnEcho_Click(e:MouseEvent):void

{

txtEcho.text += "\n";

Try

{

txtEcho.text += ext.echo (txtInput.text);

} catch (error) {}

txtEcho.text += "\nError call ext.echo:"+ e;»

}

}

  • I save the project, Open Air for the parameters of the iOS, then perform the following settings: (Yes, I know... I'll have to use adt to perform the build, but I need to first create the swf file)
    • File: EchoExtensionTester.ipa
    • AppName: EchoExtensionTester
    • Version 1.0
    • Landscape
    • Full screen on
    • Auto orientation is disabled
    • GPU rendering
    • device: iPad and iPhone
    • RES: high
    • Deployment: I use my certificate and profile provisionging that I use for my main project (that works) and defined for the test of the device.
  • I close the window and save again... but before I publish, I opened newly created "EchoExtensionTester - app.xml" which is located in my app folder.
  • I add the extensions <>< extensionID > com.extensions.EchoExtension < / extensionID > < / extensions > to the XML in the file so now it looks like this:

<? XML version = "1.0" encoding = "UTF-8" standalone = 'no '? >

" < application xmlns =" http://ns.Adobe.com/air/application/3.0 ">

<>Extensions

< extensionID > com.extensions.EchoExtension < / extensionID >

< / extensions >

< id > EchoExtensionTester < /ID >

< versionNumber > 1.0 < / versionNumber >

< file_name > EchoExtensionTester < / name of the file >

< description / >

<!-to locate the description, use the following format for the description element. < description > < text XML: lang = "fr" > App English description goes here < / text > < text XML: lang = "fr" > French App description goes here < / text > < XML text: lang = "ja" > Japanese App description goes here < / text > < / description >->

< name > EchoExtensionTester < / name >

<!-to locate the name, use the following format for the name element. < name > < text XML: lang = "fr" > insert here the name App English < / text > < text XML: lang = "fr" > insert here the French App name < / text > < XML text: lang = "ja" > insert here the Japanese App name < / text > < / name >->

< copyright / >

< initialWindow >

< content > EchoExtensionTester.swf < / content >

standard < systemChrome > < / systemChrome >

< clear > false < / transparent >

< visible > true < / visible >

true < fullscreen > < / full screen >

landscape of < aspectRatio > < / aspectRatio >

GPU < renderMode > < / renderMode >

< maximizable > true < / maximizable >

< minimizable > true < / minimizable >

< resizable > true < / resizable >

< autoOrients > false < / autoOrients >

< / initialWindow >

< icon / >

< customUpdateUI > false < / customUpdateUI >

< allowBrowserInvocation > false < / allowBrowserInvocation >

< iPhone >

< InfoAdditions >

<! [CDATA [< key > UIDeviceFamily < / key > < table > < String > 1 < / string > < string > 2 < / string > < / array >]] >

< / InfoAdditions >

< requestedDisplayResolution > top < / requestedDisplayResolution >

< / iPhone >

< / application >

  • I save the changes to the xml file and return to Flash. I then publish.
  • The swf file is created as it should be, but then I get the error message:

Error creating files.

A native implementation extension 'com.extensions.EchoExtension' required by the application is not found for the target platform.

  • Now, while it is a pain in the rear, I again, this was going to happen because in my reading tutorials and samples, they have all said that you use adt to build the ipa... but that is fine... all I wanted anyway, was the swf, which I now have in my app folder.
  • I close flash because I no longer need and I create a new batch file: (Note: I have change the name of the cert, profile and password for this post)

CLS

"D:\SDKs\AirSDK30\bin\adt" - package - target the ipa-ad-hoc - stores pkcs12 - keystore "D:\src\mycert.p12" - storepass MYPASSWORD-putting into service-profile "D:\src\myprovfile.mobileprovision" "EchoExtensionTester.ipa" "EchoExtensionTester - app.xml" "EchoExtensionTester.swf" - extdir... / lib/Build

Set dummy = p

ECHO done

  • I then open a command window in my app folder and run build.bat.
  • I wait about 2 minutes...
  • ...
  • ...
  • YAY! My ipa file was created without error reported so far... Time to copy this bad boy to the iPad and see what happens.
  • I opened iTunes, drag "EchoExtensionTester.ipa" to the applications, then synchronize my device...
  • ...
  • YAY! iTunes installed ipa on the device... and there is a white icon bright and shiney for Echo Extension tester...
  • I open the app... and...
  • nothing.
  • I'm waiting for
  • still nothing.
  • I go to the bathroom.
  • I'll be back... still nothing... just a black screen.
  • I press the home button on the iPad, the app minimized, I restore it... nothing... black screen.

management of human resources. Time to do some trial and error to see if I can figure out what the distribution.

  • As a test, I opened my fla and I comment out the following lines:
    • Ext = new EchoExtension();
    • txtEcho.text += ext.echo (txtInput.text);
  • I then rebuild the swf... get the same error (don't care)... I then rebuild the ipa using the batch file... and reinstall it on the device when it is made.
  • Exactly the same thing...
  • I opened the xml file... and remove the < extensionID > com.extensions.EchoExtension < / extensionID > line, save and re - run the batch file again... Wait for the ipa ends, then run it on the device.
  • I start the program on the iPad and it starts perfectly... with the exception of the commented line of code actually create and call the extension, everything works as it should. The runtime on the device reports as 3.0.0.4080
  • A test, I opened the .fla save and uncomment the 2 lines, I commented out above... keep the xml file extensionID, I re - publish the ipa... of course, this time, it actually creates the flash API, because the id of the extension is not in the xml file.
  • I put the file API with the extension in place on the ipad code... The fire and make the txtInput text and press the button of the echo. I get the following error:
    • Error calling ext.echo: TypeError: Error #1009
  • I suspect it's because I failed to include the extension in the descriptor... but when I build it with the extensionid in the xml file, I just get a black screen. I'm 99% sure that the context of the extension in the ext object is null (because that's what happens when I run Flash debug without extension lines in the xml)

And here I am stuck.

Can someone tell me what I am doing wrong or what I forgot to do?

Thank you.

Hi can check you if the CFC of the native extension is linked as external?

Next image can help locate and change the link type of CFC.

The issue that many people face here (i.e. extension works fast/interpreter mode and only when they are packed in standard mode) occurs only when the SWC of the NE is not linked externally.

I hope this helps.

Kind regards

Mathyas blabla

IOS of the AIR

Tags: Adobe AIR

Similar Questions

Maybe you are looking for