Adobe AIR: ошибка № 3500

РЕДАКТИРОВАТЬ: наконец-то я смог создать "Hello, World!" набор проектов. Если у вас также есть Error #3500 проблемы, см. мой ответ ниже для получения рабочего набора проектов.

Сейчас я пишу "Hello, World!" Собственное расширение для Adobe AIR с FlashDevelop. Таким образом, мое собственное расширение предназначено для использования платформами Windows-x86, на которых я программирую.

Я создал ANE с помощью (пользовательского) командного файла. Тестовое приложение AIR, которое использует этот ANE, компилируется нормально, но, как и многие другие люди, сообщения которых я видел, я получаю Error #3500: The extension context does not have a method with the name helloWorld.

Я уже три дня пытаюсь понять, что происходит, и, несмотря на исправление нескольких причин, все еще получаю ту же ошибку.

Кажется, что среда выполнения приложения никогда не может вызвать функцию initializeExtension, поскольку DebugView ничего не отслеживает, хотя мой инициализатор использует OutputDebugString(L"Extension initialized");.

Мне немного не по себе из-за того, что я опубликовал много кода, но после трех дней и десятков прочитанных веб-страниц я просто не уверен, откуда взялась моя проблема.

В любом случае, сборка приложения выполняется в 3 этапа:

1) Сборка DLL в Visual Studio с флагом Release. Я публикую этот код в ответ на комментарий Майкла ниже, однако я не уверен, что ошибка исходит оттуда.

Моя нативная часть в основном состоит из заголовка и файла C ++:

// -------------------------
// | NativeExtensionTest.h |
// -------------------------

#pragma once

#include "FlashRuntimeExtensions.h"

#ifdef __cplusplus
EXTERN_C
{
#endif

    __declspec(dllexport) void initializeExtension(
    void** dataToSet,
    FREContextInitializer* contextInitializer,
    FREContextFinalizer* contextFinalizer
    );


    __declspec(dllexport) void finalizeExtension(
        void* extData
        );


    __declspec(dllexport) void initializeContext(
        void* contextData,
        const uint8_t* contextType,
        FREContext context,
        uint32_t* nFunctionsToSet,
        const FRENamedFunction** functionsToSet
        );


    __declspec(dllexport) void finalizeContext(
        FREContext context
        );


    __declspec(dllexport) FREObject helloWorld(
        FREContext context,
        void* functionData,
        uint32_t argc,
        FREObject argv[]
        );

#ifdef __cplusplus
}
#endif

А вот и реализация функций:

// ------------------
// | HelloWorld.cpp |
// ------------------

#pragma once

#include "stdafx.h" // precompiled header ; includes cstdlib, cstring and windows.h
#include "FlashRuntimeExtensions.h"
#include "NativeExtensionTest.h"


using namespace std;


void initializeExtension(
void** dataToSet,
FREContextInitializer* contextInitializer,
FREContextFinalizer* contextFinalizer
)
{
    dataToSet = NULL;
    *contextInitializer = &initializeContext;
    *contextFinalizer = &finalizeExtension;
}



void finalizeExtension(
    void* extData
    )
{ }



void initializeContext(
    void* contextData,
    const uint8_t* contextType,
    FREContext context,
    uint32_t* nFunctionsToSet,
    const FRENamedFunction** functionsToSet
    )
{
    *nFunctionsToSet = 1;
    FRENamedFunction* functions = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)* (*nFunctionsToSet));

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

    *functionsToSet = functions;
}


void finalizeContext(
    FREContext context
    )
{ }


FREObject helloWorld(
    FREContext context,
    void* functionData,
    uint32_t argc,
    FREObject argv[]
    )
{
    char* hello = "Hello, World!";
    unsigned int helloLength = strlen(hello) + 1;
    FREObject ret;

    FRENewObjectFromUTF8(helloLength, (const uint8_t*)hello, &ret);

    return ret;
}

Как и просили alebianco, вот журнал сборки при сборке DLL. Обратите внимание, что у меня есть ошибка в самом конце журнала, в конце выполнения пользовательского командного файла сборки. Я не знаю, откуда взялась эта ошибка; У меня не было этой ошибки в прошлый раз, когда я создавал этот проект. Кроме того, это, вероятно, внутреннее для FlashDevelop.

2) Создание ANE. Я использую командный файл для выполнения следующих команд:

Чтобы построить SWC, я вызываю compc. После раскрытия переменной это выглядит так:

compc -include-sources"C:\Users\Anthony Dentinger\Desktop\Native Extension Test\src" -output "C:\Users\Anthony Dentinger\Desktop\Native Extension Test\ANE Build Files\NativeExtHelloWorld.swc" -load-config "C:\Users\Anthony Dentinger\AppData\Local\FlashDevelop\Apps\flexsdk\4.6.0\frameworks\air-config.xml" -swf-version 14

Моя папка src содержит простой класс:

package
{
    import flash.events.EventDispatcher;
    import flash.external.ExtensionContext;


    public class NativeExtHelloWorld extends EventDispatcher {

        private var extContext:ExtensionContext;

        public function NativeExtHelloWorld()
        {
            extContext = ExtensionContext.createExtensionContext("NativeExtHelloWorld", "helloWorldContext");
        }

        public function helloWorld() : String
        {
            return String(extContext.call("helloWorld"));
        }

    }

}

В свою очередь, скопировав как DLL из моей папки Visual Studio, так и library.swf (который я извлекаю из SWC) в ANE Build Files\platforms\Windows-x86, я создаю ANE с помощью adt. После раскрытия переменной команда выглядит так:

call adt -package -target ane "C:\Users\Anthony Dentinger\Desktop\Native Extension Test\ANE Build Files\HelloExtension.ane" "C:\Users\Anthony Dentinger\Desktop\Native Extension Test\ANE Build Files\descriptor.xml" -swc "C:\Users\Anthony Dentinger\Desktop\Native Extension Test\ANE Build Files\NativeExtHelloWorld.swc" -platform "Windows-x86" -C "C:\Users\Anthony Dentinger\Desktop\Native Extension Test\ANE Build Files\platforms\Windows-x86" .

Вот дескриптор расширения, который я предоставляю adt:

<?xml version="1.0" encoding="utf-8"?> 
<extension xmlns="http://ns.adobe.com/air/extension/3.1">

    <id>NativeExtHelloWorld</id> <!--I'll later change that ID to something like com.example.myExt.HelloWorld-->
    <name>Exension Name</name>
    <description>Description of the Extension</description>
    <versionNumber>0.0.1</versionNumber>
    <copyright>© 2010, Examples, Inc. All rights reserved.</copyright>

    <platforms>
        <platform name="Windows-x86">
            <applicationDeployment>
                <nativeLibrary>HelloWorld.dll</nativeLibrary>
                <initializer>initializeExtension</initializer>
                <finalizer>finalizeExtension</finalizer>
            </applicationDeployment>
        </platform>
    </platforms>

</extension>

3) Создание фактического приложения. Я использую пакетные файлы по умолчанию, созданные FlashDevelop (с двумя модификациями, включающими ANE) для создания проекторов AIR AS3.

Обратите внимание: если я получаю ошибку № 3500, это означает (я полагаю), что мое приложение успешно включило мой класс из ANE, поскольку конструктор работает.

Это дескриптор приложения, который я использую на всякий случай.

<?xml version="1.0" encoding="utf-8" ?> 
<application xmlns="http://ns.adobe.com/air/application/15.0">

    <id>TEST</id>
    <versionNumber>1.0</versionNumber>
    <filename>TEST</filename>
    <name>TEST</name>

    <initialWindow> 
        <title>TEST</title> 
        <content>TEST.swf</content> 
        <systemChrome>standard</systemChrome> 
        <transparent>false</transparent> 
        <visible>true</visible> 
        <minimizable>true</minimizable> 
        <maximizable>true</maximizable> 
        <resizable>true</resizable> 
    </initialWindow> 

    <supportedProfiles>extendedDesktop</supportedProfiles>

    <extensions>
        <extensionID>NativeExtHelloWorld</extensionID>
    </extensions>
</application>

Я использую Flex (4.6.0), объединенный с AIR SDK (22.0.0).

Я сделал что-то не так? Что поможет мне решить эту проблему?

Еще раз прошу прощения, что опубликовал довольно много кода; Я попытался сократить до наиболее актуальных.

Заранее спасибо!


person AnthonyD973    schedule 17.08.2016    source источник
comment
Привет! Эта ошибка обычно указывает на проблему с машинным кодом, заключающуюся в том, что вы не объявили метод. Можете ли вы опубликовать код для инициализации контекста расширения на нативной стороне?   -  person Michael    schedule 17.08.2016
comment
@Michael Как вы просили, я добавил свой собственный код.   -  person AnthonyD973    schedule 17.08.2016
comment
Ошибок компиляции не будет, даже если ваш код ANE полностью неверен, если вы не попытаетесь вызвать что-то в своем ANE. Похоже, что часть ActionScript расширения не может найти функцию helloWorld в вашем коде C ++. Я понятия не имею о C ++, но предполагаю, что что-то пошло не так в ваших объявлениях функций, которые вы делаете в initializeContext. Возможно, функции [0] .name = (const uint8_t *) helloWorld; часть не так?   -  person Philarmon    schedule 17.08.2016
comment
@Philarmon Мое приложение вызывает функцию helloWorld класса расширения AS3. В свою очередь (как показывает код AS3 на шаге 2) эта функция вызывает собственную функцию helloWorld. Таким образом, я вызываю нативную функцию. Что касается назначения C ++, я не думаю, что это неправильно, поскольку я в основном повторно использовал код в Пример Adobe.   -  person AnthonyD973    schedule 17.08.2016
comment
@Philarmon Если только принуждение к const uint8_t* не соответствует таблице ANSI ... Я должен это проверить.   -  person AnthonyD973    schedule 17.08.2016
comment
Да, и похоже, что ошибка возникает, когда часть AS3 пытается вызвать встроенную функцию helloWorld. Собственные функции должны быть зарегистрированы с именем (как вы это делаете в initializeContext), чтобы они были видимы для части AS3. Итак, я предполагаю, что ваша функция либо неправильно зарегистрирована, либо, возможно, ANE неправильно упакован. Вы используете последнюю версию AIR SDK?   -  person Philarmon    schedule 17.08.2016
comment
@Philarmon Да, я использую Flex SDK 4.6.0, объединенный с AIR SDK 22.0.0. Использование только AIR SDK 22.0.0 дает тот же результат.   -  person AnthonyD973    schedule 17.08.2016
comment
@Philarmon Я проверил, вывел таблицу const uint8_t* в двоичный файл. Принуждение правильно; он также следует за таблицей ASCII и заканчивается символом NULL.   -  person AnthonyD973    schedule 17.08.2016
comment
вы можете регистрировать операции на собственной стороне? Я никогда не работал с расширениями Windows, но с расширениями android и ios ведение журнала спасло меня во многих ситуациях. часто инициализация идет неправильно и функция не регистрируется правильно   -  person alebianco    schedule 19.08.2016
comment
@alebianco Готово. Заранее благодарим за помощь! (P.S., моя версия Visual Studio - французская.)   -  person AnthonyD973    schedule 19.08.2016


Ответы (1)


Как-то решил проблему, теперь все работает. Я попытался вернуться, чтобы увидеть, что я делал не так, но не могу понять. Я предполагаю, что один из командных файлов, который копирует и распаковывает ANE, использовал неправильную цель, поэтому я в конечном итоге использовал тот же старый ANE, а не использовал ANE, который я создавал (глупый я).

По запросу Colonize.bat вот рабочий Hello, World! пример. Для этого я использовал VisualStudio 2013 и FlashDevelop.

Вы можете найти несколько причин ошибки # 3500 в следующих файлах:

  • 1_Build_DLL/Hello World/main.cpp
  • 2_Build_ANE/lib/descriptor.xml
  • 2_Build_ANE/src/HelloWorldExtension.as

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

ПРИМЕЧАНИЕ: не пытайтесь строить напрямую из этих файлов. Я использую командные файлы, чтобы не нужно было запускать команды и копировать / вставлять / распаковывать файлы вручную, поэтому целевые объекты и переменные среды не будут действительны на вашем компьютере.

person AnthonyD973    schedule 23.08.2016
comment
Вы думаете, что можете предоставить дамп этого проекта, чтобы другие могли его проверить? В настоящее время я нахожусь на четвертом дне выяснения ошибки # 3500 и очень застрял в том, почему и где. - person Colonize.bat; 10.09.2016
comment
@ Colonize.bat Ага, это раздражает, правда? Конечно, я могу это сделать. Однако из-за того, что я много раз создавал проект с нуля, у меня есть несколько полу-рабочих файлов. Дайте мне пару дней и я выложу рабочий набор проектов. - person AnthonyD973; 11.09.2016
comment
@ Colonize.bat Приносим извинения за задержку; Последние несколько дней я был занят. Вы можете найти набор рабочих проектов по ссылке в ответе выше. - person AnthonyD973; 15.09.2016