Frage

Ich versuche, eine native Erweiterung der Luft zu erstellen, und nach erfolgreicher Zusammenstellung aller Komponenten hat Flash Builder 4.6 Protokolle "Fehler #3500: Der Erweiterungskontext hat keine Methode mit dem Namen ...".

Hier ist der C ++ - Code für die native DLL:

#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;
}

Hier ist der Code für die ActionScript 3 -Schnittstelle:

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();
        }
    }
}

Jede Hilfe bei der Lösung dieses Problems wäre geschätzt.

War es hilfreich?

Lösung 5

Ich habe dieses Problem gelöst. Ich bin mir nicht ganz sicher, wie ich mit einem anderen ANE -Projekt begann und von dort aus gebaut habe. Ich vermute jedoch, dass das Problem im ActionScript -Teil des Codes und im Erweiterungsdeskriptor mit falschen Paketnamen zu tun hatte.

Andere Tipps

Bitte siehe hierher: http://forums.adobe.com/thread/923158

Wenn Sie diesen Fehler erhalten haben, wenn Sie mehr als eine Erweiterung im selben Projekt haben, seien Sie vorsichtig: Jeder Initializer End Finalizer -Methoden müssen zwischen allen Erweiterungen unterschiedliche und eindeutige Namen haben. NB. Nicht nur die in erweitert.xml angegebenen Methoden, sondern auch die, die Sie zum Initialisieren des Kontextes delagieren. Um klar zu sein: Nicht nur der Erweiterungsinitialisierer, sondern auch der Kontextinitializer im Projekt muss eindeutige Namen zwischen allen Erweiterungen haben.

Z.B.:

 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;
}

Und das gleiche für den Finalizer.

Ich hoffe das hilft.

Um Symbolnamenkonflikte zwischen Anes zu lösen, gibt es eine neue ADT -Option in Air 3.4 dh Hideanelibsymbols

Verweisen: http://help.adobe.com/en_us/air/build/ws901d38e593cd1bac1e63e3d128cdca935b-8000.html

Um den Prozess des Beginns des Schreibens eines Ane für iOS zu erleichtern, habe ich eine Xcode -Ane -Vorlage geschrieben.

Verweisen: https://github.com/divijkumar/xcode-template-ane

Lesen Sie die Anweisungen auf der Github Wiki -Seite, bevor Sie anfangen.

Hatte das gleiche Problem, aber auf Betonmaschine (andere funktionieren gut) und nichts hilft, bis ich meine DLL mit wieder aufgebaut habe Freisetzende Flagge. Es scheint, als ob Debug -Version einige auf dem Benutzer -PC installierte Addination DLL installiert ist. Stellen Sie daher sicher, dass Sie mit Release Flag erstellen!

Es scheint, dass die C ++ - Funktion "getString" Argumente erfordert. Also, wenn Sie anrufen _ExtensionContext.call("getString") as String; C ++ hat keine GetString () -Methode. Es möchte, dass Sie auch Argumente durchlaufen. Fügen Sie diese zur Methode wie SO hinzu:

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

Die Argumente, die Sie verabschieden, müssen vom entsprechenden Typ sein, der von der C ++ -GetString -Methode angegeben ist.

Siehe Referenz:http://help.adobe.com/en_us/flashplatform/reference/actionscript/3/flash/external/extensioncontext.html#call()

Diese Frage ist alt, aber es gibt keine solide Antwort. Ich bin mit einem Android -Ane auf das gleiche Problem gestoßen. In Ihrer Freextsion -Funktion/-klasse, Sie muss Geben Sie eine neue Instanz von Frecontext zurück und in diesem Fall von Frecontext Sie muss Geben Sie die Funktionskarte zurück. Ich machte den Fehler, die Karte nicht zurückzugeben und wie ein Huhn herumzulaufen, mit dem Kopf abgeschnitten wurde, um herauszufinden, was los war. Hoffentlich hilft das in Zukunft jemandem.

Ich hatte das gleiche Problem und keine der anderen Antworten hier hat es für mich gelöst. Ich habe versucht, ein einfaches C ++ -Ane für das Blackberry Playbook zu erstellen und würde immer einen Fehler #3500 bekommen, wenn ich versuchte, es auszuführen. Der gleiche genaue Code funktionierte gut in C. Es stellte sich heraus, dass der C ++ - Compiler den Methodennamen mangeln, sodass die Methode, die ich anrief, nicht feststellte. Ich habe es gelöst, indem ich meine Funktionsdefinitionen in externe "C" wie folgt einwickelte:

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[]);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top