6 Replies Latest reply on Nov 2, 2013 8:25 PM by blufiro

    Air to C Native Extention - Error #3500

    TFirk118

      Hello, I'm new to the Adobe Forums, and I was hoping I could get some help with the Native Extension I am trying to build to connect a C dll to an Air project with Flash Builder 4.6.  This is a simple hello world project, so I wasn't expecting such complications.

       

      If you want to take a look, this is the tutorial I followed: http://quetwo.com/2011/12/10/creating-a-windows-air-native-extension-with-eclipse-part-4/

       

      Now, I managed to:

      1. Write the C files (SampleANE.c and SampleANE.h) using MinGW

      2. Generate the .dll file (libSampleANE.dll release version)

      3. Write the actionscript class (SampleANE.as) and its descriptor file (descriptor.xml)

      4. Compile said files into an .ane file using adt from the Flash Builder library (Note: I properly extracted the library.swf)

      5. Include that .ane file within a flex project using the built-in Native Extention handler

      6. And write a simple flex program that uses the functions (SampleANEProject.mxml and SampleANEProject-app.xml)

       

      Whenever I try to call any function from the native C, however, I receive the error...

       

      ArgumentError: Error #3500: The extension context does not have a method with the name isSupported.
          at flash.external::ExtensionContext/_call()
          at flash.external::ExtensionContext/call()
          at com.tfirk118.samples.ANESample::SampleANE/isSupported()[C:\Users\owner\Adobe Flash Builder 4.6\SampleANELib\src\com\tfirk118\samples\ANESample\SampleANE.as:25]
          at SampleANEProject/isANESupported()[C:\Users\owner\Adobe Flash Builder 4.6\SampleANEProject\src\SampleANEProject.mxml:19]
          at SampleANEProject/___SampleANEProject_Button1_click()[C:\Users\owner\Adobe Flash Builder 4.6\SampleANEProject\src\SampleANEProject.mxml:40]
      

       

      where "isSupported" could be any function I tried to define.

       

      From debugging my code, I'm certain the Flex portion and the ActionScript portion are working perfectly as far as the calling of functions.  The ActionScript also seems to grab a ExtentionContext object from ExtentionContext.getExtentionContext(...), as _ExtentionContext isn't receiving null.

       

      I'll post my code for all my files down here (sorry if this isn't proper etiquette, but I'm trying to be thorough):

       

      SampleANE.h

       

      #ifndef SAMPLEANE_H_
      #define SAMPLEANE_H_
      
      #include "FlashRuntimeExtensions.h"        // Import the Adobe Headers so we can program our ANE
      
          __declspec(dllexport) void initializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer);
          __declspec(dllexport) void finalizer(void* extData);
      
      #endif /* SAMPLEANE_H_ */
      

       

      SampleANE.c

       

      //For ANE Setup
      #include "FlashRuntimeExtensions.h"
      #include "stdlib.h"
      #include "SampleANE.h"
      
      //Extra
      #include "String.h"
      
      FREObject isSupported(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
      {
          FREObject result;
      
          uint32_t isSupportedInThisOS = 1;
          FRENewObjectFromBool(isSupportedInThisOS, &result);
      
          return result;
      }
      
      FREObject getTestString(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
      {
          FREObject result;
      
          const char *str = "This is a test string from ANE!";
          FRENewObjectFromUTF8(strlen(str)+1, (const uint8_t*)str, &result);
      
          return result;
      }
      
      FREObject getHelloWorld(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
      {
          FREObject result;
      
          const char *str = "Hello World! This is your DLL talking!";
              FRENewObjectFromUTF8(strlen(str)+1, (const uint8_t*)str, &result);
      
          return result;
      }
      
      void contextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctions, const FRENamedFunction** functions)
      {
          *numFunctions = 3;
          FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * (*numFunctions));
      
          func[0].name = (const uint8_t*) "getTestString";
          func[0].functionData = NULL;
          func[0].function = &getTestString;
      
          func[1].name = (const uint8_t*) "isSupported";
          func[1].functionData = NULL;
          func[1].function = &isSupported;
      
          func[3].name = (const uint8_t*) "getHelloWorld";
          func[3].functionData = NULL;
          func[3].function = &getHelloWorld;
      
          *functions = func;
      }
      
      void contextFinalizer(FREContext ctx)
      {
          return;
      }
      
      void initalizer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer)
      {
          *ctxInitializer = &contextInitializer;
          *ctxFinalizer = &contextFinalizer;
      }
      
      void finalizer(void* extData)
      {
          return;
      }
      

       

      SampleANE.as

       

      package com.tfirk118.samples.ANESample
      {
          import flash.events.EventDispatcher;
          import flash.events.IEventDispatcher;
          import flash.external.ExtensionContext;
      
          public class SampleANE extends EventDispatcher
          {
      
              private var _ExtensionContext:ExtensionContext;
      
              public function SampleANE(target:IEventDispatcher=null)
              {
                  _ExtensionContext = ExtensionContext.createExtensionContext("com.tfirk118.samples.SampleANE", null);
                  super(target);
              }
      
              public function dispose():void
              {
                  _ExtensionContext.dispose();
              }
      
              public function isSupported():Boolean
              {
                  return _ExtensionContext.call("isSupported");
              }
      
              public function getTestString():String
              {
                  return _ExtensionContext.call("getTestString") as String;
              }
      
              public function getHelloWorld():String
              {
                  return _ExtensionContext.call("getHelloWorld") as String;
              }
      
          }
      }
      

       

      descriptor.xml

       

      <?xml version="1.0" encoding="UTF-8"?>
      <extension xmlns="http://ns.adobe.com/air/extension/2.5">
          <id>com.tfirk118.samples.SampleANE</id>
          <versionNumber>1.0.0</versionNumber>
          <platforms>
              <platform name="Windows-x86">
                  <applicationDeployment>
                      <nativeLibrary>libSampleANE.dll</nativeLibrary>
                      <initializer>initializer</initializer>
                      <finalizer>finalizer</finalizer>
                  </applicationDeployment>
              </platform>
          </platforms>
      </extension>
      

       

      SampleANEProject.mxml

       

      <?xml version="1.0" encoding="utf-8"?>
      <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                             xmlns:s="library://ns.adobe.com/flex/spark" 
                             xmlns:mx="library://ns.adobe.com/flex/mx"
                             close="appClosing(event)">
          <fx:Declarations>
              <!-- Place non-visual elements (e.g., services, value objects) here -->
          </fx:Declarations>
      
          <fx:Script>
              <![CDATA[
      
                  import com.tfirk118.samples.ANESample.SampleANE;
      
                  public var sample:SampleANE = new SampleANE();
      
                  public function isANESupported(event:MouseEvent):void
                  {
                      trace(sample.isSupported());
                  }
      
                  protected function appClosing(event:Event):void
                  {
                      sample.dispose();
                  }
      
                  protected function helloWorldTest(event:MouseEvent):void
                  {
                      txtDisplay.text = sample.getHelloWorld();
                  }
      
                  protected function testStringTest(event:MouseEvent):void
                  {
                      txtDisplay.text = sample.getTestString();
                  }
      
              ]]>
          </fx:Script>
      
          <s:Button x="39" y="32" label="Button" click="isANESupported(event)"/>
          <s:TextInput x="39" y="77" id="txtDisplay"/>
          <s:Button x="40" y="123" label="Hello World" click="helloWorldTest(event)"/>
          <s:Button x="40" y="152" label="Get Test" click="testStringTest(event)"/>
      
      </s:WindowedApplication>
      

       

      SampleANEProject-app.xml

       

      <?xml version="1.0" encoding="utf-8" standalone="no"?>
      <application xmlns="http://ns.adobe.com/air/application/3.1">
      
      <!-- Adobe AIR Application Descriptor File Template.
      
          Specifies parameters for identifying, installing, and launching AIR applications.
      
          xmlns - The Adobe AIR namespace: http://ns.adobe.com/air/application/3.1
                  The last segment of the namespace specifies the version 
                  of the AIR runtime required for this application to run.
      
          minimumPatchLevel - The minimum patch level of the AIR runtime required to run 
                  the application. Optional.
      -->
      
          <!-- A universally unique application identifier. Must be unique across all AIR applications.
          Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required. -->
          <id>com.tfirk118.samples.SampleANEProject</id>
      
          <!-- Used as the filename for the application. Required. -->
          <filename>SampleANEProject</filename>
      
          <!-- The name that is displayed in the AIR application installer. 
          May have multiple values for each language. See samples or xsd schema file. Optional. -->
          <name>SampleANEProject</name>
      
          <!-- A string value of the format <0-999>.<0-999>.<0-999> that represents application version which can be used to check for application upgrade. 
          Values can also be 1-part or 2-part. It is not necessary to have a 3-part value.
          An updated version of application must have a versionNumber value higher than the previous version. Required for namespace >= 2.5 . -->
          <versionNumber>0.0.0</versionNumber>
      
          <!-- A string value (such as "v1", "2.5", or "Alpha 1") that represents the version of the application, as it should be shown to users. Optional. -->
          <!-- <versionLabel></versionLabel> -->
      
          <!-- Description, displayed in the AIR application installer.
          May have multiple values for each language. See samples or xsd schema file. Optional. -->
          <!-- <description></description> -->
      
          <!-- Copyright information. Optional -->
          <!-- <copyright></copyright> -->
      
          <!-- Publisher ID. Used if you're updating an application created prior to 1.5.3 -->
          <!-- <publisherID></publisherID> -->
      
          <!-- Settings for the application's initial window. Required. -->
          <initialWindow>
              <!-- The main SWF or HTML file of the application. Required. -->
              <!-- Note: In Flash Builder, the SWF reference is set automatically. -->
              <content>[This value will be overwritten by Flash Builder in the output app.xml]</content>
      
              <!-- The title of the main window. Optional. -->
              <!-- <title></title> -->
      
              <!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. -->
              <!-- <systemChrome></systemChrome> -->
      
              <!-- Whether the window is transparent. Only applicable when systemChrome is none. Optional. Default false. -->
              <!-- <transparent></transparent> -->
      
              <!-- Whether the window is initially visible. Optional. Default false. -->
              <!-- <visible></visible> -->
      
              <!-- Whether the user can minimize the window. Optional. Default true. -->
              <!-- <minimizable></minimizable> -->
      
              <!-- Whether the user can maximize the window. Optional. Default true. -->
              <!-- <maximizable></maximizable> -->
      
              <!-- Whether the user can resize the window. Optional. Default true. -->
              <!-- <resizable></resizable> -->
      
              <!-- The window's initial width in pixels. Optional. -->
              <!-- <width></width> -->
      
              <!-- The window's initial height in pixels. Optional. -->
              <!-- <height></height> -->
      
              <!-- The window's initial x position. Optional. -->
              <!-- <x></x> -->
      
              <!-- The window's initial y position. Optional. -->
              <!-- <y></y> -->
      
              <!-- The window's minimum size, specified as a width/height pair in pixels, such as "400 200". Optional. -->
              <!-- <minSize></minSize> -->
      
              <!-- The window's initial maximum size, specified as a width/height pair in pixels, such as "1600 1200". Optional. -->
              <!-- <maxSize></maxSize> -->
      
              <!-- The initial aspect ratio of the app when launched (either "portrait" or "landscape"). Optional. Mobile only. Default is the natural orientation of the device -->
      
              <!-- <aspectRatio></aspectRatio> -->
      
              <!-- Whether the app will begin auto-orienting on launch. Optional. Mobile only. Default false -->
      
              <!-- <autoOrients></autoOrients> -->
      
              <!-- Whether the app launches in full screen. Optional. Mobile only. Default false -->
      
              <!-- <fullScreen></fullScreen> -->
      
              <!-- The render mode for the app (either auto, cpu, gpu, or direct). Optional. Default auto -->
      
              <!-- <renderMode></renderMode> -->
      
              <!-- Whether or not to pan when a soft keyboard is raised or lowered (either "pan" or "none").  Optional.  Defaults "pan." -->
              <!-- <softKeyboardBehavior></softKeyboardBehavior> -->
          <autoOrients>false</autoOrients>
              <fullScreen>false</fullScreen>
              <visible>false</visible>
          </initialWindow>
      
          <!-- We recommend omitting the supportedProfiles element, -->
          <!-- which in turn permits your application to be deployed to all -->
          <!-- devices supported by AIR. If you wish to restrict deployment -->
          <!-- (i.e., to only mobile devices) then add this element and list -->
          <!-- only the profiles which your application does support. -->
          <!-- <supportedProfiles>desktop extendedDesktop mobileDevice extendedMobileDevice</supportedProfiles> -->
      
          <!-- The subpath of the standard default installation location to use. Optional. -->
          <!-- <installFolder></installFolder> -->
      
          <!-- The subpath of the Programs menu to use. (Ignored on operating systems without a Programs menu.) Optional. -->
          <!-- <programMenuFolder></programMenuFolder> -->
      
          <!-- The icon the system uses for the application. For at least one resolution,
          specify the path to a PNG file included in the AIR package. Optional. -->
          <!-- <icon>
              <image16x16></image16x16>
              <image32x32></image32x32>
              <image36x36></image36x36>
              <image48x48></image48x48>
              <image57x57></image57x57>
              <image72x72></image72x72>
              <image114x114></image114x114>
              <image128x128></image128x128>
          </icon> -->
      
          <!-- Whether the application handles the update when a user double-clicks an update version
          of the AIR file (true), or the default AIR application installer handles the update (false).
          Optional. Default false. -->
          <!-- <customUpdateUI></customUpdateUI> -->
      
          <!-- Whether the application can be launched when the user clicks a link in a web browser.
          Optional. Default false. -->
          <!-- <allowBrowserInvocation></allowBrowserInvocation> -->
      
          <!-- Listing of file types for which the application can register. Optional. -->
          <!-- <fileTypes> -->
      
              <!-- Defines one file type. Optional. -->
              <!-- <fileType> -->
      
                  <!-- The name that the system displays for the registered file type. Required. -->
                  <!-- <name></name> -->
      
                  <!-- The extension to register. Required. -->
                  <!-- <extension></extension> -->
      
                  <!-- The description of the file type. Optional. -->
                  <!-- <description></description> -->
      
                  <!-- The MIME content type. -->
                  <!-- <contentType></contentType> -->
      
                  <!-- The icon to display for the file type. Optional. -->
                  <!-- <icon>
                      <image16x16></image16x16>
                      <image32x32></image32x32>
                      <image48x48></image48x48>
                      <image128x128></image128x128>
                  </icon> -->
      
              <!-- </fileType> -->
          <!-- </fileTypes> -->
      
          <!-- iOS specific capabilities -->
          <!-- <iPhone> -->
              <!-- A list of plist key/value pairs to be added to the application Info.plist -->
              <!-- <InfoAdditions>
                  <![CDATA[
                      <key>UIDeviceFamily</key>
                      <array>
                          <string>1</string>
                          <string>2</string>
                      </array>
                      <key>UIStatusBarStyle</key>
                      <string>UIStatusBarStyleBlackOpaque</string>
                      <key>UIRequiresPersistentWiFi</key>
                      <string>YES</string>
                  ]]>
              </InfoAdditions> -->
              <!-- A list of plist key/value pairs to be added to the application Entitlements.plist -->
              <!-- <Entitlements>
                  <![CDATA[
                      <key>keychain-access-groups</key>
                      <array>
                          <string></string>
                          <string></string>
                      </array>
                  ]]>
              </Entitlements> -->
          <!-- Display Resolution for the app (either "standard" or "high"). Optional. Default "standard" -->
          <!-- <requestedDisplayResolution></requestedDisplayResolution> -->
          <!-- </iPhone> -->
      
          <!-- Specify Android specific tags that get passed to AndroidManifest.xml file. -->
          <!--<android> -->
          <!--    <manifestAdditions>
              <![CDATA[
                  <manifest android:installLocation="auto">
                      <uses-permission android:name="android.permission.INTERNET"/>
                      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
                      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
                      <uses-feature android:required="true" android:name="android.hardware.touchscreen.multitouch"/>
                      <application android:enabled="true">
                          <activity android:excludeFromRecents="false">
                              <intent-filter>
                                  <action android:name="android.intent.action.MAIN"/>
                                  <category android:name="android.intent.category.LAUNCHER"/>
                              </intent-filter>
                          </activity>
                      </application>
                  </manifest>
              ]]>
              </manifestAdditions> -->
              <!-- Color depth for the app (either "32bit" or "16bit"). Optional. Default 16bit before namespace 3.0, 32bit after -->
              <!-- <colorDepth></colorDepth> -->
          <!-- </android> -->
          <!-- End of the schema for adding the android specific tags in AndroidManifest.xml file -->
      
      <extensions>
              <extensionID>com.tfirk118.samples.SampleANE</extensionID>
          </extensions>
      </application>
      

       

       

      Thanks for any help in advance, I've been stuck on this for a while.

        • 1. Re: Air to C Native Extention - Error #3500
          QueTwo Level 1

          The error you are getting is indicating that your DLL file is not loading properly, or it is not getting the function pointers properly.  This could be because your ANE is not packaged properly, but it is more likely that your DLL is not getting registered and called by ADT. 

           

          Another thing to note is you passed back that you have 3 functions back to the AVM, but you declared 0, 1, 3 (missed two in that array).  This WILL cause problems, but I don't know if it would be effecting isSupported.  It should only knock off getHelloWorld.

          • 2. Re: Air to C Native Extention - Error #3500
            michaelarchbold Level 2

            Hi,

             

            I'm experiencing the same problem. Have followed the same tutorial so not sure if it's something missing from there or if it's something I've missed. I've built many other ANE's and just can't seem to get this working with eclipse.

             

            Have you had any luck in identifying the problem?

             

            Regards,

            Michael

             

            Though it seems to work when I package an export release rather than just debugging...

            • 3. Re: Air to C Native Extention - Error #3500
              blufiro

              I'm also having this problem. I'm using Flash Builder 4.6, AIR 3.4 and I've made a DLL (e.g. ExtensionDll.dll) which needs to call functions in another DLL (e.g. DllUsedByExtensionDll.dll) . I've made sure my ANE is working with the ExtensionDll.dll already, so there are no issues with my actionscript code or my ANE packaging or my DLL compilation. However, once I start calling functions from the other DLL, it starts throwing me Error #3500. Even if I call this function (e.g. abc()) in ExtensionDll.dll, but I never actually use the function from actionscript, and I call another function (e.g. def()) from actionscript, the Error #3500 still appears, so it does not seem to depened on the whether the code is used or not.

               

               

              It's similar to this problem.

              http://stackoverflow.com/questions/9823504/how-to-use-external-dll-in-air-native-extension

               

               

              Does anyone have a solution or at least a way to debug this?

              • 4. Re: Air to C Native Extention - Error #3500
                blufiro Level 1

                Ok I've managed to solve this myself. The problem is that ExtensionDll.dll cannot find the DllUsedByExtensionDll.dll when it is launched from the debugger, since the executable for the debugger is located in the AIR SDK. There are two solutions:

                 

                 

                1. Export Release Build, while making sure that the DllUsedByExtensionDll.dll is packaged in the same directory as your executable.
                2. For debugging purposes, copy the DllUsedByExtensionDll.dll into your Adobe AIR SDK bin directory, where the Air Debug Launcher (adl) executable is located.

                 

                Unfortunately Flash Builder hides the error messages from Windows, so it led me on a wild goose chase until I ran the app by command line instead of through Flash Builder. I suggest that Adobe can either show the error messages or instead of just printing Error #3500, they can print out different errors for different scenarios. This will help developers greatly.

                • 5. Re: Air to C Native Extention - Error #3500
                  ThijsInteractionDesign

                  I am having the same problem (or similar) with a tutorial I ran on my Mac and my Native Extension is for iOS. Unfortunately we do not have .dll files on a mac. Doed anybody know how to solve this problem for me?

                  • 6. Re: Air to C Native Extention - Error #3500
                    blufiro Level 1

                    Mac uses dylib (Dynamic Libraries) instead of dlls which you have to compile yourself using XCode. Note that dylibs only run on Mac OSX, not iOS. Even if it runs on iOS, your app will get rejected.