2016-08-17 6 views
2

EDIT: Я, наконец, смог сделать «Привет, мир!». проект. Если у вас также есть проблемы Error #3500, см. my answer below для рабочего набора проектов.Adobe AIR: Ошибка # 3500

В настоящее время я делаю «Привет, мир!». Родное расширение для Adobe AIR с FlashDevelop. Таким образом, My Native Extension используется для использования на платформах Windows-x86, на которых я программирую.

Я построил ANE через (пользовательский) пакетный файл. Тестирование AIR Application, которое использует этот 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 просил, here is the build log при строительстве 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 из моей визуальной папки студии и 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 Projectors.

Обратите внимание, что если я получаю сообщение об ошибке # 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).

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

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

Заранее благодарен!

+0

Привет, Эта ошибка обычно указывает на проблему с нативным кодом, поскольку вы не объявили этот метод. Можете ли вы опубликовать код для инициализации контекста расширения на внутренней стороне? – Michael

+0

@Michael Как вы просили, я добавил свой собственный код. –

+1

Ошибок компиляции не будет, даже если ваш код ANE совершенно не прав, если вы не попытаетесь вызвать что-то в своем ANE. Кажется, что часть actionscript расширения не может найти функцию helloWorld в вашем коде на C++. Я понятия не имею о C++, но я бы предположил, что что-то пошло не так в ваших объявлениях функций, которые вы выполняете в initializeContext.Возможно, функции [0] .name = (const uint8_t *) «helloWorld»; часть ошибочна? – Philarmon

ответ

1

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

После запроса Colonize.bat, here is a working Hello, World! example. Для этого я использовал VisualStudio 2013 и FlashDevelop.

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

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

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

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

+0

Как вы думаете, вы можете предоставить свалку этого проекта для других, чтобы проверить? В настоящее время я нахожусь на 4-й день, выясняя ошибку # 3500, и я очень зациклен на том, почему и где. –

+1

@ Colonize.bat Да, это раздражает, не так ли? Конечно, я могу это сделать. Однако из-за того, что я сделал проект с нуля, у меня есть несколько полуработающих файлов. Дайте мне пару дней, и я загружу рабочий проект. –

+1

@ Colonize.bat Извините за задержку; Я был занят в последние несколько дней. Вы можете найти рабочий проект, указанный в ссылке в ответе выше. –