Расширения нативного воздуха «Контекст расширения не имеет метода с именем»

StackOverflow https://stackoverflow.com/questions/8360591

Вопрос

Я пытаюсь сделать расширение нативного воздуха, и после успешного сборника всех компонентов Flash Builder 4.6 Журналы «Ошибка #3500: В контексте расширения нет метода с именем ...».

Вот код C ++ для нативного 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;
}

Вот код для интерфейса 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();
        }
    }
}

Любая помощь в решении этой проблемы будет оценена.

Это было полезно?

Решение 5

Я решил эту проблему. Я не совсем уверен, как я начал с другого проекта ANE и построил оттуда. Однако я подозреваю, что проблема была связана с неправильными именами пакетов в части ActionScript в коде и дескрипторе расширения.

Другие советы

Пожалуйста, смотрите здесь: http://forums.adobe.com/thread/923158

Если вы получили эту ошибку, когда у вас есть более одного расширения в одном и том же проекте, будьте осторожны: каждый методы финализатора инициализатора должны иметь разные и уникальные имена между всеми расширениями. Нб. Не только методы, указанные в extension.xml, но также и те, которые вы разлагаете, чтобы инициализировать контекст. Чтобы быть ясным: не только инициатор расширения, но и контекстный инициатор внутри проекта должен иметь уникальные названия между всеми расширениями.

Например.:

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

И то же самое для финализатора.

Надеюсь, это поможет.

Чтобы разрешить конфликты имени символа между ANE, в Air 3.4 появилась новая опция ADT.

Ссылаться: http://help.adobe.com/en_us/air/build/ws901d38e593cd1bac1e63e3d128cdca935b-8000.html

Кроме того, чтобы облегчить процесс начала работы с написанием ANE для iOS, я написал шаблон Xcode ANE.

Ссылаться: https://github.com/divijkumar/xcode-template-ane

Прочитайте инструкции на странице Wiki GitHub, прежде чем начать работу.

Была такая же проблема, но на конкретной машине (другие работают просто отлично), и ничего не помогает, пока я не восстановил свой DLL с выпустить флаг. Анкет Похоже, что отладочная версия запросит некоторую DLL DLL, установленную на пользовательском ПК, поэтому убедитесь, что вы создаете с флагом выпуска!

Похоже, что функция C ++ «GetString» требует аргументов. Итак, когда вы звоните _ExtensionContext.call("getString") as String; C ++ не имеет метода GetString (). Он хочет, чтобы вы также проходили аргументы. Добавьте их в метод вызова, как SO:

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

Аргументы, которые вы передаете, должны быть соответствующего типа, указанного методом C ++ GetString.

См. Ссылку:http://help.adobe.com/en_us/flashplatform/reference/actionscript/3/flash/external/extensioncontext.html#call()

Этот вопрос старый, но нет солидного ответа. Я столкнулся с той же проблемой с Android ANE. В вашей функции Freextension/класс вы должен Верните новый экземпляр Frecontext и в этом случае Frecontext, вы должен вернуть карту функции. Я совершил ошибку, не вернув карту и бегал, как курица с отрезанной головой, пытаясь выяснить, что происходит. Надеюсь, это поможет кому -то в будущем.

У меня была такая же проблема, и ни один из других ответов здесь не решил это для меня. Я пытался создать простой C ++ ANE для BlackBerry Playbook и получил ошибку #3500 в любое время, когда пытался его запустить. Тот же самый точный код работал нормально в C. Оказывается, компилятор C ++ выполнял имя метода, так что он не мог найти метод, который я звонил. Я решил это, обернув определения функции на внешнем «C», как это:

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[]);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top