Skip navigation
Currently Being Moderated

Can someone tell me what I am doing wrong when creating a native extension for iPad? (Very detailed)

Oct 26, 2011 12:46 PM

Tags: #air #flash #iphone #cs5.5 #3.0 #ios #ipad #extension #native

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

 

The client requires that certain features be supported - such things like GameCenter, Rating system, etc... none of which is currently supported by flash for the iOS.

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

 

My idea was to bridge the gap in functionality by creating a native exention that utilized the xcode source that was given to me, thus giving me the functionality that is required.

 

But first, I need to actually CREATE a native extension, even just a basic echo/hello world... I have followed all the steps from various guides and tutorials and I have managed to create an ipa and put it on my iPad2 to test, but when the program starts up, nothing happens, I am left with a black screen. When I comment out the lines of code that intialize the extension, it fires up just fine.

(and yes, I even tried to put things in try blocks in case there was an error - no luck)

 

So I am hoping that someone can read through the process of what I am doing below and point out what I am doing wrong, or what I am missing.

 

 

What I am using:

 

Mac Mini running OSX 10.7.2 - this is used to run xCode 4.1 build 4B110

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

The PC does have flash builder installed, but I have never really used it, nor do I know how to use it... everything that has been built to date has been done using Flash CS5.5

 

 

So, this is what I have done.

 

 

 

The first thing I do is create a .a static library on the 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 EchoExtension.h file as all the samples I have seen to date don't use it.
  • I then add "FlashRuntimeExtension.h" to the project from the AIR3.0 sdk frameworks folder on my PC
  • I then delete everything in my .m file and, following several different examples and tutorials, type up the following code:

 

 

//

//  EchoExtension.m

//  EchoExtension

//

 

 

#include "FlashRuntimeExtensions.h"

 

FREObject echo(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) {

 

    // setup the number of functions in this extention

 

    // for easy reference, set the number of function that this extention will use.

    int FunctionCount = 1;

 

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

    *numFunctionsToTest = FunctionCount;

 

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

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

 

    // create an array entry for each function

 

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

    func[0].functionData = NULL;                    // the data type

    func[0].function = &echo;             // reference to the actual function

 

 

    // save the array in a pointer.

    *functionsToSet = func;

}

 

// A native context instance is disposed

void ContextFinalizer(FREContext ctx) {

    return;

}

 

// Initialization function of each extension

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

    *extDataToSet = NULL;

    *ctxInitializerToSet = &ContextInitializer;

    *ctxFinalizerToSet = &ContextFinalizer;

}

 

// Called when extension is unloaded

void ExtFinalizer(void* extData) {

    return;

}

 

  • I then go "Product", "Build" and it creates libEchoExtension.a
  • I copy this .a file over to my PC.

 

 

 

 

 

I am now finish with that god foresaken mac (*shudders*)
Back on my PC, I create a folder for my test project. For all intents an purposes, let's call this "D:\src\EchoExtension" I then create 2 folders, one called "lib" and one called "app". Lib is where I will 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 in my lib folder, the following:
    • com\extensions\EchoExtension\EchoExtension.as
    • a folder called "Build" in which I place my libEchoExtension.a file.
  • in my EchoExtension.as file, I place the following code:

 

package com.extensions.EchoExtension

{

    import flash.events.EventDispatcher;

    import flash.events.IEventDispatcher;

    import flash.external.ExtensionContext;

 

    public class EchoExtension extends EventDispatcher

    {

        protected var _extensionContext:ExtensionContext;

 

        /**

         * Constructor.

         */

        public function EchoExtension()

        {

            super();

            // Initialize extension.

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

        }

 

        public function echo(Prompt:String):String

        {

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

        }

 

    }

}

 

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

 

import com.extensions.EchoExtension.EchoExtension;

 

var ext:EchoExtension = new EchoExtension();

 

stop();

 

 

  • I then open up my fla's publish settings, turn off the swf - which I don't need, and check the swc and make sure that it outputs into my build folder.  "./Build/EchoExtension.swc"
  • I also set the player to Air 3.0 (which I can do since I have successfully integrated AIR 3.0 along side my AIR 2.6 and can build both without any problems)
  • I then publish the swc. So far, so good. No problems.
  • I then make a copy of the swc and rename it to EchoExtension.swc.zip, at which point I extract the library.swf file from it and also place it in my build folder.
  • I then create extension.xml in by build folder which contains the following code:

 

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

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

  <versionNumber>1</versionNumber>

  <platforms>

    <platform name="iPhone-ARM">

        <applicationDeployment>

            <nativeLibrary>libEchoExtension.a</nativeLibrary>

            <initializer>ExtInitializer</initializer>

            <finalizer>ExtFinalizer</finalizer>

        </applicationDeployment>

    </platform>  

  </platforms>

</extension>

 

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

 

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

 

  • I then open a command prompt and run buildane.bat and poof. My ane is created. My build folder has the following files in it now:
      • buildane.bat
      • EchoExtension.ane
      • EchoExtension.swc
      • EchoExtension.swc.zip
      • extension.xml
      • libEchoExtension.a
      • library.swf

 

 

 

 

Now that I have my swc, ane, and all that, 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 into the app folder I created ealier.
  • I then create a new flash project called EchoExtensionTester.fla
  • I open the action script settings, library paths, and add the swc that I created in my D:\src\EchoExtension\lib\build folder to my project.
  • On my stage, I create an input text field called txtInput, a dynamic text field called txtEcho, and a couple of buttons called btnClear, btnRuntime, and btnEcho
  • I open up the first layer in the time line and place the following code:

 

// basic imports.

import flash.desktop.NativeApplication;

import flash.events.MouseEvent;

import flash.text.TextField;

 

// import the extension from our swc.

import com.extensions.EchoExtension.EchoExtension;

 

// set our input text field to need the softkeyboard

txtInput.needsSoftKeyboard = true;

 

// add the 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 extension variable.

var ext:EchoExtension;

 

try

{

    // initialize our echo extension.

    ext = new EchoExtension();

} catch (e:Error) {

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

}

 

 

stop();

 

// clear the echo text field

function btnClear_Click(e:MouseEvent):void

{

    txtEcho.text = "";

}

 

// just for testing, put the current version of air runtime into our text field so we can make sure we are running air 3.0

function btnRunTime_Click(e:MouseEvent):void

{

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

}

 

// call the extension, passing it whatever is in the input text field and have it return it and place it in our echo text field

function btnEcho_Click(e:MouseEvent):void

{

    txtEcho.text += "\n";

    try

    {

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

    } catch (e:Error) {

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

    }

}

 

  • I then save the project, Open the Air for iOS settings and set the following:  (but yes, I know... I am going to have to use adt to do the build, but I need to create the swf first)
    • Output file: EchoExtensionTester.ipa
    • Appname: EchoExtensionTester
    • Version 1.0
    • Landscape
    • Fullscreen On
    • Auto orientation is off
    • rendering GPU
    • device: iPad and iPhone
    • Res: High
    • Deployement: I use my certificate and provisionging profile that I use for my Primary project (which work) and set for device testing.
  • I close the window and save again... but before I publish, I open  newly created "EchoExtensionTester-app.xml" that is in my app folder.
  • I add <extensions>    <extensionID>com.extensions.EchoExtension</extensionID>  </extensions> to the xml 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>

  <filename>EchoExtensionTester</filename>

  <description/>

 

  <!-- To localize the description, use the following format for the description element.<description><text xml:lang="en">English App description goes here</text><text xml:lang="fr">French App description goes here</text><text xml:lang="ja">Japanese App description goes here</text></description>-->

 

  <name>EchoExtensionTester</name>

 

  <!-- To localize the name, use the following format for the name element.<name><text xml:lang="en">English App name goes here</text><text xml:lang="fr">French App name goes here</text><text xml:lang="ja">Japanese App name goes here</text></name>-->

 

  <copyright/>

  <initialWindow>

    <content>EchoExtensionTester.swf</content>

    <systemChrome>standard</systemChrome>

    <transparent>false</transparent>

    <visible>true</visible>

    <fullScreen>true</fullScreen>

    <aspectRatio>landscape</aspectRatio>

    <renderMode>gpu</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><array><string>1</string><string>2< /string></array>]]>

    </InfoAdditions>

    <requestedDisplayResolution>high</requestedDisplayResolution>

  </iPhone>

</application>

 

 

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

 

Error creating files.

 

An implmentation for native extension 'com.extensions.EchoExtension' required by the application was not found for the target platform.

 

  • Now, while this is a pain in the rear, I new this was going to happen because in my reading of tutorials and samples, they all said that you must use adt to build the ipa... but that's fine... all I wanted anyway was the swf, which I now have in my app folder.
  • I close down flash as I don't need it anymore and I create a new batch file: (note: I change the names of the cert, provision profile, and password for this post)

 

cls

 

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

 

set /p dummy=

 

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 has been created with no errors reported so far.... Time to copy this bad boy to the iPad and see what happens.
  • I open iTunes, drag "EchoExtensionTester.ipa" over to the Apps, then sync my device....
  • ...
  • YAY! iTunes has successfully installed the ipa on the device... and there is by bright and shiney blank icon for Echo Extension Tester...
  • I open the app.... and.....
  • nothing.
  • I wait
  • still nothing.
  • I go to the bathroom.
  • I get back... still nothing... just a black screen.
  • I press the iPad home button, the app minimized, I restore it... nothing... black screen.

 

 

hrm. Time to do a little trial and error to see if I can figure out where the break down is.

 

 

  • As a test, I open 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 re-install it on the device when it's done.
  • The exact same thing....
  • I open the xml file... and remove the <extensionID>com.extensions.EchoExtension</extensionID> line, save and re-run the batch file again... wait for the ipa to finish, and run it on the device.
  • I fire up the program on the iPad and it launches perfectly... except for the commented line of code to actually create and call the extension, everything works as it should. The runtime on the device is reporting as 3.0.0.4080
  • As a test, I open the .fla back up and uncomment the 2 lines I commented out above... keeping the extensionID out of the xml file, I re-publish the ipa.... of course, this time, it actually creates the ipa from flash because the extension id is not in the xml.
  • I put the ipa file with the extension code in place on the ipad... Fire it up and put some text into the txtInput and press the echo button. I get the following error:
    • Error calling ext.echo: TypeError: Error #1009
  • I suspect that is because I failed into include the extension in the descriptor... but when I build it with the extensionid in the xml, I just get a black screen. I am 99% sure that the extension context in the ext object is null (because that is what happens when I run it in flash debug without the extension lines in the xml)

 

 

 

And here I am stuck.

Can anyone tell me what I am doing wrong or what I have forgotten to do?

 

Thanks.

 
Replies 1 2 Previous Next
  • Currently Being Moderated
    Oct 26, 2011 1:46 PM   in reply to DaveGallant

    AIR 3 links against iOS 4.0. What is your native library set to? (I didn't see anything else suspicious in what you are doing, but I haven't built an iOS extension myself, yet.)

     
    |
    Mark as:
  • Currently Being Moderated
    Oct 26, 2011 2:28 PM   in reply to DaveGallant

    I assumed that there would be some link options somewhere. After looking at XCode a bit, this seems to be set by the Base SDK setting. However, I only get an option for iOS 4.3 and I don't see a way to get the iOS 4 SDK from Apple (?). .

     
    |
    Mark as:
  • Currently Being Moderated
    Oct 26, 2011 3:06 PM   in reply to Joe ... Ward

    Xcode 4.2 only has SDKs for iOS 4.3 and 5.0. The older Xcode has SDKs for 3.0 - 4.3. That Xcode isn't compatible with Lion.

     

    The version numbers are a bit confusing, so I'm not fully sure what Xcode you will get at this link, but it ought to be able to make things for iOS 4:

     

    http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftw are?bundleID=20792

     

    Make sure to rename or duplicate your current Developer folder, so that this install doesn't overwrite the newer Xcode (in case you should ever need it).

     

    It's funny in a way if AIR does require 4.0, because most devices that are using something earlier than 4.3 are also the same devices that cannot run AIR.

     
    |
    Mark as:
  • Currently Being Moderated
    Oct 26, 2011 11:14 PM   in reply to DaveGallant

    Well, I'm not sure that this is the issue. It is the case that you can only link to iOS 4 libraries. I'm asking around here, but I haven't gotten an answer yet.

     

    [Edit] It looks like I was wrong. While you can only use those frameworks that were originally available in iOS 4.0, using iOS 4.3 as the base SDK should be fine. CoreMidi is the only iOS 4.3 framework that can't be used. Sorry for introducing a red herring into the mix.

     

    Message was edited by: Joe ... Ward

     
    |
    Mark as:
  • Currently Being Moderated
    Oct 27, 2011 11:24 AM   in reply to DaveGallant

    Dave,

     

    If you comment out the extension code in your app and display the value of NativeApplication.nativeApplication.runtimeVersion, what do you see on the device? Does it indicate AIR 3, or something earlier? Nevermind, I see you already did that.

     

    It (still) sounds like the problem isn't in how you are creating the ANE, but rather on the application compiling or packaging side.

     

    Another thing to check is that the EchoExtension.swc is externally linked (but that is the default, so it probably is unless you changed it).

     

    -Joe

     
    |
    Mark as:
  • Currently Being Moderated
    Oct 27, 2011 1:12 PM   in reply to DaveGallant

    It has to be external, otherwise the runtime looks for the code in the wrong place.

     

    Have you been able to connect to the debugger when you run the app? That should reveal any errors occuring at initialization.

     
    |
    Mark as:
  • Currently Being Moderated
    Oct 28, 2011 10:52 AM   in reply to DaveGallant

    I tried building your extension code last night. I got an immediate app crash on accessing the extension code, too.  I can't help you with debugging C (or interpreting crash logs). Hopefully someone with such knowledge can step in.

     
    |
    Mark as:
  • Currently Being Moderated
    Oct 28, 2011 11:42 AM   in reply to DaveGallant

    Hi Dave:

     

    Thinking loudly

     

    1. I could see that your native code says return argv[0] bet you dont seem to pass anything from AS side. on AS side call should be like _ext.call("echo","Hi There") so that "Hi there" is FREObject that you will get in argv[0]

     

    2. When you use other extensions do you remove yours? or you try using multiple at once?

     

    3. There is no use of manipulating .app folder. You can asume it is almost always correct. you cant use the .app folder once you modify it.

     

    4. Please dont add .a .swc .ane as assets. That is incorrect.

     
    |
    Mark as:
  • Currently Being Moderated
    Oct 28, 2011 11:49 AM   in reply to Saumitra Bhave

    Dave, I was able to use the iBattery extension (using the pre-built version, I didn't try building it myself).

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 1, 2011 11:10 AM   in reply to DaveGallant

    Hello,

     

    I am also struggling with a native extension crashing upon load on iOS. I think I found out what is going wrong in my case, although I have no idea about how to fix it.

     

    Before concluding we're having the same problem, however, I'd like to confirm a couple of things:

     

    1) are you getting any errors/warnings in the output of "adt -package -target ipa-ad-hoc" ?

     

    2) could you please try to build, install and run a non-AOT version of your application (i.e. -target ipa-test-interpreter or -target ipa-debug-interpreter)?

     

    3) what kind of architecture are you building the iOS static library for? armv6, armv7 or both? (It's one of the first lines under the build settings of the library target in XCode).

     

    Thanks,

    Andrea

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 2, 2011 7:28 AM   in reply to DaveGallant

    Can you be sure that you're not using any external AS3 at all?

     

    The fact that you're set to ARMv6 and ARMv7 seems unusual, as AIR requires ARMv7.

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 2, 2011 8:03 AM   in reply to Colin Holgate

    In my experience ARMv6 works too in non-AOT builds, whether it's intended or not...

     

    Dave, could you try setting the architecture to armv7 only and building the library with GCC 4.2 (NOT llvm-gcc)? It should be one of the compilers available in the iPhone SDK 4.3 that ships with XCode 4.1.

     

    andrea

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 2, 2011 8:14 AM   in reply to DaveGallant

    iPad will be ok. iPhone 3GS will too. iPhone 3G cannot work with AIR 3 at all.

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 2, 2011 9:06 AM   in reply to DaveGallant

    Dave, I'm sorry but it looks like it's a different problem.

     

    In my case compiling with plain GCC did solve the crashes.

     

    Perhaps you could try to narrow down the exact place of the crash on the native side by inserting NSLog(@"...") calls in the methods (the output is visible in the device console in the XCode organizer); this should at least tell you if your native code has had a chance to run before the crash or not.

     

    andrea

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 2, 2011 10:30 AM   in reply to DaveGallant

    The output from NSLog is visible in the device console (it's in the xcode 'organizer' window, near the 'logs' item where you go to download crash stack traces), not in the flash debugger console.

     

    It's quite puzzling that your application crashes even before trying to load the extension...

     

    Interpreted and compiled builds seem to behave  differently wrt bugs in native extensions. While experimenting, I managed to accidentally set a bogus number of functions (greater than actual) in the context initializer; this had no apparent ill effect in interpreted builds, but caused compiled builds to crash without fail.

     

    andrea

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 4, 2011 1:10 PM   in reply to DaveGallant

    I'm having this same issue also. The app crashing right when ExtensionContext.createExtensionContext is called

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 4, 2011 1:22 PM   in reply to DaveGallant

    Hi Can you check if the SWC of the native extension is linked as external?

     

    Following image can help locate and change the SWC link type.

     

    Screen shot 2011-11-05 at 1.51.10 AM.png

     

    The issue that many people face here (i.e. extension works in fast/interpreter mode and doesnt when packaged as standard mode) happens only when the SWC of the NE is not externally linked.

     

    I hope this helps.

     

    Regards,

    Saumitra Bhave

    AIR iOS

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 9, 2011 7:01 AM   in reply to DaveGallant

    Hello,

     

    It seems like I've been down your road for about a week ago too. So I thought I provide some tips and also see if they can lead to

    som clarity of my current problem. (I'm also quite new on the mac/ios/extensions development, but with the complete developing chain included,

    it's one of the hardest things I've done so far). I guess that what you get when you using new technologies (like extensions) that no one had the time to test

    or tutorialize properly.

     

    Some things then:

     

    - I made a test-app in the imac just to test my library. That way I can test the lib with a much shorter cycle, with xcode debugging (NSLog an such).

      Since all FREObjects won't work this way I had to make a sub-lib that is used by the "FRE-lib" and test that sub-lib instead.

     

    - I had to use FlexBuilder4.6 (beta) to be able to compile natives (or start the flex debugger) when using ane files. But apart from the debugger I'm using

      command line mxmlc and adt so far.

     

    - The Ipad has to be on the same subnet as my dev-computer, at least to my knowledge, just to minimize problems with firewalls and such.

     

    - At some point I had to use the "http://ns.adobe.com/air/application/3.1" namespace in the app-descriptor xml file (and the extensions.xml) with the latest air sdk       (3.1.0.4720, thats what my adt reports)

     

    - I benefited greatly on comparison to the public iBattery and Vibration projects/tutorials.

     

    - I still have to figure out how to use resources (like icons) in the native library since the .a file doesn't seem to be able to pack such files. I guess I have to pack in      a resource bundle with adt, but I'm not sure.

     

    - I have only tested interpreted code, and had it working.

     

    - I have not been able to build .a files with LLVM3 or LLVM GCC 4.2. I get another format of the .a file, and cannot get any native results with them. I had to use the     plain GCC 4.2 setting for any succes. It seems like the GCC4.2 .a files starts with a 48 byte header before the "!<arch>" continues. I have not yet figured

        out what is the difference of the files or if the start of the file matters.

     

    - Finally:  I upgraded the dev-ipad to IOS5 and then I also had to go to xcode 4.2, and now I can't use the GCC4.2 anymore.

     

    I get "Unsupported compiler 'GCC 4.2' selected for architecture 'armv7'". Can anyone point me in the right direction for this?

     

    /Ola

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 9, 2011 11:45 AM   in reply to OlaLofberg

    @Dave: glad to know you solved your problem! Out of curiosity, were you able to use a native library compiled with llvm-gcc/clang or you just kept using gcc-4.2 ?

     

    @OlaLofberg:

     

    The problem I encountered is not with the library headers, but with the compiled objects themselves. I dug around a bit with otool -r and it seems that unlike plain GCC, the LLVM backend for ARMv7 emits a kind of relocation (type 9, HALF_DIF) which the linker in the AOT compiler cannot handle.

    Therefore, when the native library is compiled with llvm-gcc or clang, the adt -package invocation produces a number of  "ld warning: unexpected srelocation type 9" messages and the packaged application crashes on extension initialization.

     

    Given that the generation of half-word relocations for ARMv7 in LLVM cannot be turned off, and that all of the iOS native libraries in the example extensions I could find online appear to have been compiled with gcc-4.2, I'd like to know if I'm doing something wrong or if compilers using the LLVM backend are in fact not currently supported in AIR.

     

    The iPhone 5.0 SDK that comes with XCode 4.2 only has clang and llvm-gcc. Until these issues are sorted out you have to uninstall it and go back to  the 4.3 SDK (which means XCode 4.0 on Snow Leopard or 4.1 on Lion).

     

    andrea

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 14, 2011 2:22 AM   in reply to andrea.conti

    @OlaLofberg:

     

    The problem I encountered is not with the library headers, but with the compiled objects themselves. I dug around a bit with otool -r and it seems that unlike plain GCC, the LLVM backend for ARMv7 emits a kind of relocation (type 9, HALF_DIF) which the linker in the AOT compiler cannot handle.

    Therefore, when the native library is compiled with llvm-gcc or clang, the adt -package invocation produces a number of  "ld warning: unexpected srelocation type 9" messages and the packaged application crashes on extension initialization.

     

    Given that the generation of half-word relocations for ARMv7 in LLVM cannot be turned off, and that all of the iOS native libraries in the example extensions I could find online appear to have been compiled with gcc-4.2, I'd like to know if I'm doing something wrong or if compilers using the LLVM backend are in fact not currently supported in AIR.

     

    The iPhone 5.0 SDK that comes with XCode 4.2 only has clang and llvm-gcc. Until these issues are sorted out you have to uninstall it and go back to  the 4.3 SDK (which means XCode 4.0 on Snow Leopard or 4.1 on Lion).

     

    andrea

    Hello, thanks for the reply.

     

    Yes, I recognize the "srelocation type 9".

     

    @DaveGallant:

    Are you really sure you managed to get an extension running with the LLVM GCC? No old libs or something? I know I always

    have to check the build dates and often foced to do build clean before building again.

    If you did, I guess there's still hope for me too.

     

    Or else, I can't get an adobe flex extension running on IOS5.

    (Since IOS5 needs xcode 4.2 and there's no GCC there and it's only GCC that can produce .a files that can be used

    by adt)  phew.   crap..

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 14, 2011 3:07 AM   in reply to OlaLofberg

    Libraries built with older XCodes will work perfectly on iOS 5.

     

    You only need to use the 5.0 SDK if you're using XCode to interactively debug an application on a device with iOS 5.

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 14, 2011 6:59 AM   in reply to andrea.conti

    andrea.conti wrote:

     

    Libraries built with older XCodes will work perfectly on iOS 5.

     

    You only need to use the 5.0 SDK if you're using XCode to interactively debug an application on a device with iOS 5.

     

    Ok, thanks. I get it.

     

    But you can't use any library that has or uses a (sub)library which contain a "srelocation type 9" in flex native extensions then?

     

    If so:

    Is this an issue for adobe adt?  Should one report it as a bug/feature somewhere maybe? Where?

     

    /Ola

     
    |
    Mark as:
  • Currently Being Moderated
    Nov 14, 2011 9:03 AM   in reply to OlaLofberg

     

    But you can't use any library that has or uses a (sub)library which contain a "srelocation type 9" in flex native extensions then?

     

    If so:

    Is this an issue for adobe adt?  Should one report it as a bug/feature somewhere maybe? Where?

     

    /Ola

     

    I can't tell for sure. My (and apparently yours) experience would support that idea; however Dave seems to have managed to compile a working library with llvm-gcc without any problems.

    That said, there is almost certainly an issue with the toolchain in AIR for iOS not being able to process valid compiled objects, probably because the version of llvm it's based on is quite old and is missing support for some recent features.

     

    This was also reported a couple of weeks ago in the 4.6 prerelease forum  (which seemed to me a better place to discuss a possible technical problem also affecting a beta release), but I got no answer.

     

    15 minutes of rummaging through the support section of the sites gave me no indication that Adobe actually has the equivalent of a public issue tracker, so I gave up.

     

    andrea

     
    |
    Mark as:
1 2 Previous Next
Actions

More Like This

  • Retrieving data ...

Bookmarked By (0)

Answers + Points = Status

  • 10 points awarded for Correct Answers
  • 5 points awarded for Helpful Answers
  • 10,000+ points
  • 1,001-10,000 points
  • 501-1,000 points
  • 5-500 points