Domanda

Sto tentando di realizzare un'estensione nativa aerea e dopo la raccolta riuscita di tutti i componenti, Flash Builder 4.6 Logs "Errore n. 3500: il contesto di estensione non ha un metodo con il nome ...".

Ecco il codice C ++ per la DLL nativa:

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

Ecco il codice per l'interfaccia 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();
        }
    }
}

Qualsiasi aiuto per risolvere questo problema sarebbe apprezzato.

È stato utile?

Soluzione 5

Ho risolto questo problema. Non sono del tutto sicuro di come ho iniziato con un altro progetto ANE e costruito da lì. Sospetto tuttavia che il problema abbia avuto a che fare con nomi di pacchetti errati nella parte ActionScript del codice e del descrittore di estensione.

Altri suggerimenti

Si prega di vedere prima qui: http://forums.adobe.com/thread/923158

Se hai ricevuto questo errore quando si dispone di più di un'estensione all'interno dello stesso progetto, fai attenzione: ogni metodo di finalizzatore finale iniziale deve avere nomi diversi e univoci tra tutte le estensioni. Nb. Non solo i metodi specificati in Extension.xml, ma anche quelli che si delaga per inizializzare il contesto. Per essere chiari: non solo l'inizializzatore di estensione, ma anche l'inizializzatore del contesto all'interno del progetto deve avere nomi univoci tra tutte le estensioni.

Per esempio.:

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

E lo stesso per il finalizer.

Spero che questo aiuti.

Per risolvere i conflitti del nome del simbolo tra ANES, esiste una nuova opzione ADT in Air 3.4 IE Hideanelibsymbols

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

Inoltre, per facilitare il processo di inizio con la scrittura di un ANE per iOS, ho scritto un modello ane Xcode.

Fare riferimento: https://github.com/divijkumar/xcode-template-ane

Leggi le istruzioni sulla pagina Wiki GitHub prima di iniziare.

Aveva lo stesso problema ma su una macchina in cemento (altri funzionano bene) e niente mi aiuta fino a quando non ricostruisco la mia DLL Flag di rilascio. Sembra che la versione di debug richieda alcune DLL ad addini installate su PC utente, quindi assicurati di costruire con il flag di rilascio!

Sembra che la funzione C ++ "gettring" abbia richiesti argomenti. Quindi quando chiami _ExtensionContext.call("getString") as String; C ++ non ha un metodo getString (). Vuole che passi anche argomenti. Aggiungi questi al metodo di chiamata come così:

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

Gli argomenti che passa devono essere del tipo appropriato specificato dal metodo C ++ getString.

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

Questa domanda è vecchia, ma non esiste una risposta solida. Ho riscontrato lo stesso problema con un Ane Android. Nella tua funzione/classe FreeStension, tu dovere Restituisci una nuova istanza di frecontext e in quell'istanza di frecontext, tu dovere Restituisci la mappa della funzione. Ho commesso l'errore di non restituire la mappa e correre come un pollo con la testa tagliata cercando di capire cosa stesse succedendo. Spero che ciò aiuti qualcuno in futuro.

Ho avuto lo stesso problema e nessuna delle altre risposte qui lo ha risolto per me. Stavo cercando di creare un semplice ANE C ++ per il BlackBerry Playbook e avrei ricevuto un errore n. 3500 ogni volta che ho provato a eseguirlo. Lo stesso codice esatto ha funzionato bene in C. Si scopre che il compilatore C ++ stava facendo il manglini del metodo in modo da non riuscire a trovare il metodo che stavo chiamando. L'ho risolto avvolgendo le definizioni delle mie funzioni in "C" esterno in questo modo:

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[]);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top