Question

Je tente une extension AIR natif et après la compilation réussie de tous les composants, Flash Builder 4.6 journaux. « Error # 3500: Le contexte d'extension ne dispose pas d'une méthode avec le nom ... »

Voici le code C ++ pour la DLL native:

#include "stdafx.h"
#include "TestANE.h"

#include "FlashRuntimeExtensions.h"

#include <string>
#include <iostream>
#include <iomanip>
#include <algorithm>

using namespace std;

FREObject isSupported(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
    FREObject result;

    uint32_t isSupportedSwitch = 1;
    FRENewObjectFromBool(isSupportedSwitch, &result);

    return result;
}

FREObject getString(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
    FREObject result;

    const char *testString = "Hello World from C++!";
    FRENewObjectFromUTF8(strlen(testString)+1, (const uint8_t *) testString, &result);

    return result;
}

void taneContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctions, const FRENamedFunction** functions) { 
    *numFunctions = 2;
    FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * (*numFunctions));

    func[0].name = (const uint8_t*) "isSupported";
    func[0].functionData = NULL;
    func[0].function = &isSupported;

    func[1].name = (const uint8_t*) "getString";
    func[1].functionData = NULL;
    func[1].function = &getString;

    *functions = func;
}

void taneContextFinalizer(FREContext ctx) {
    return;
}

void taneInitializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer) { 
    *ctxInitializer = &taneContextInitializer;
    *ctxFinalizer = &taneContextFinalizer;
}

void taneFinalizer(void* extData) {
    return;
}

Voici le code pour l'interface ActionScript 3:

package com.tests.TestANE {
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;
    import flash.external.ExtensionContext;

    public class TestANE extends EventDispatcher {

        private var _ExtensionContext:ExtensionContext;

        public function TestANE(target:IEventDispatcher=null) {

            this._ExtensionContext = ExtensionContext.createExtensionContext("com.tests.TestANE", null);

            super(target);
        }

        public function isSupported():Boolean {
            return _ExtensionContext.call("isSupported") as Boolean;
        }

        public function getString():String {
            return _ExtensionContext.call("getString") as String;
        }

        public function dispose():void {
            this._ExtensionContext.dispose();
        }
    }
}

Toute aide dans la résolution de ce problème serait apprécié.

Était-ce utile?

La solution 5

Je l'ai résolu ce problème. Je ne suis pas tout à fait certain comment comme je l'ai commencé avec un autre projet ANE et construit à partir de là. Je soupçonne cependant que le problème avait à voir avec des noms erronés de paquet dans la partie du code ActionScript et le descripteur d'extension.

Autres conseils

S'il vous plaît voir avant ici: http://forums.adobe.com/thread/923158

Si vous avez cette erreur lorsque vous avez plus d'une extension à l'intérieur du même projet, s'il vous plaît soyez prudent: CHAQUE initialiseur fin méthodes de finaliseur DOIVENT avoir des noms différents et uniques entre toutes les extensions. NB. Non seulement les méthodes spécifiées dans extension.xml mais aussi ceux que vous delagate pour initialiser le contexte. Pour être clair:. Non seulement le prolongement initialiseur mais aussi le contexte initialiseur à l'intérieur du projet doit avoir des noms uniques entre toutes les extensions

Par exemple:.

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

       NSLog(@"Entering ExtInitializer()");

       *extDataToSet = NULL;
       *ctxInitializerToSet = &UNIQUE_NAME_ContextInitializer;
       *ctxFinalizerToSet = &UNIQUE_NAME_ContextFinalizer;

       NSLog(@"Exiting ExtInitializer()");
}

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

    *numFunctionsToTest = 1;

    FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * 1);
    func[0].name = (const uint8_t*) "scan";
    func[0].functionData = NULL;
    func[0].function = &scan;

    *functionsToSet = func;
}

Et la même chose pour le finaliseur.

J'espère que cette aide.

Pour résoudre les conflits de noms de symbole entre ENA, il y a une nouvelle option ADT dans AIR 3.4 à savoir hideANELibSymbols

Reportez-vous: http://help.adobe.com/en_US/ air / build / WS901d38e593cd1bac1e63e3d128cdca935b-8000.html

En outre, pour faciliter le processus de commencer par écrire un ANE pour iOS, j'ai écrit un modèle de ANE Xcode.

Reportez-vous: https://github.com/divijkumar/xcode-template-ane

Do lire les instructions sur la page wiki github avant de commencer.

eu le même problème, mais sur la machine en béton (autres travaillent très bien) et l'aide de rien jusqu'à ce que je reconstruis mon dll avec le drapeau version . Il semble que la demande de version de débogage de certains dll addination installé sur le PC de l'utilisateur, alors assurez-vous que vous construisez avec le drapeau de la libération!

Il semble que la fonction C de « getString » a des arguments requis. Ainsi, lorsque vous appelez _ExtensionContext.call("getString") as String; C ++ n'a pas une méthode getString (). Il veut que vous passer par des arguments aussi. Ajoutez-les à Teh méthode d'appel comme ceci:

_ExtensionContext.call("getString", arg, arg1, arg2) as String;

Les arguments que vous passez doit être du type approprié spécifié par le c ++ méthode getString.

Voir la référence: http://help.adobe.com /en_US/FlashPlatform/reference/actionscript/3/flash/external/ExtensionContext.html#call ()

Cette question est vieux, mais il n'y a pas de réponse solide. Je suis tombé sur le même problème avec un Android ANE. Dans votre fonction FREExtension / classe, vous devez retourner une nouvelle instance de FREContext et dans ce cas de FREContext, vous doit retourner la carte de fonction. J'ai fait l'erreur de ne pas retourner la carte et courir comme un poulet avec sa coupe de tête hors essayer de comprendre ce qui se passait. Si tout va bien que quelqu'un d'aide à l'avenir.

J'ai eu ce même problème et aucun des autres réponses ici résolu pour moi. Je suis en train de créer un simple c ++ ANE pour le Blackberry Playbook et recevrais une erreur # 3500 chaque fois que j'essayé de l'exécuter. Le même code a bien fonctionné en C. Il se le compilateur c ++ a été fait le nom de la méthode mutiler il n'a pas pu trouver la méthode que je l'appelais. Je l'ai résolu en enveloppant mes définitions de fonctions dans extern « C » comme ceci:

extern "C" {
    void ExtensionInitializer(void** extDataToSet,
        FREContextInitializer* ctxInitializerToSet,
        FREContextFinalizer* ctxFinalizerToSet);
    void ExtensionFinalizer();

    void ContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx,
        uint32_t* numFunctionsToSet, const FRENamedFunction** functionsToSet);
    void ContextFinalizer(FREContext ctx);

    FREObject myMethod(FREContext ctx, void* functionData, uint32_t argc,
        FREObject argv[]);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top