Записи с меткой: compiler

4. Air extensions: разработка с помощью MinGW

Настройка MS Visual Studio не самое интересное занятие, кроме нее может понадобиться установка Windows Driver Kit (WDK). Настройка проектов, солюшенов, автоматических билдов достаточно сложное занятие. Поэтому посмотрев на HIDAPI, я решил тоже использовать  MinGW (что такое MinGW можно почитать тут).

Краткая инструкция по созданию расширений с помощью MinGW:

Building with MinGW

1. Setup MinGW: HOWTOforMinGW
2. Download MinGW Utils (mingw-util-0.3): mingw-utils
3. Create def-file using reimp from utils: reimp -d FlashRuntimeExtensions.lib
4. Rename generated def file(«Adobe Air» or similar) to FlashRuntimeExtensions.def
5. Create .a library from FlashRuntimeExtensions.lib(see Air SDK lib folder):
dlltool -d FlashRuntimeExtensions.def -l FlashRuntimeExtensions.a
6. Fix FlashRuntimeExtensions.h or #undef WIN32

#ifdef __MINGW32__
    #include <stdint.h>
#else
    #ifdef WIN32
          typedef unsigned __int32	uint32_t;
          typedef unsigned __int8		uint8_t;
          typedef          __int32	int32_t;
    #else
          #include <stdint.h>
    #endif
#endif

7. Now you can compile dll:
g++ -Wall -shared Extension.cpp -o Extension.dll -L. -lFlashRuntimeExtensions -static-libgcc -static-libstdc++
8. Read DevelopingActionScriptExtensionsForAdobeAIR.pdf

Example:

Extension.h:

//air3.0\include\
#include "FlashRuntimeExtensions.h"

#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllexport) void initializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer);
__declspec(dllexport) void finalizer(void* extData);

#ifdef __cplusplus
}
#endif

Extension.cpp:

#include <malloc.h>
#include "Extension.h"
#ifdef __cplusplus
extern "C" {
#endif
    //will return Boolean true to AS3 side
    FREObject test(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
    {
        bool value = true;
        FREObject resultObject;
        FRENewObjectFromBool(value, &resultObject);
        return resultObject;
    }

    /*
    * usage:
    * var context:ExtensionContext = ExtensionContext.createExtensionContext("AnyContext", null);
    * var result:Boolean = context.call('test') as Boolean;
    */
    void contextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctions, const FRENamedFunction** functions)
    {
        *numFunctions = 1;

        FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * (*numFunctions));

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

        *functions = func;
    }

    void contextFinalizer(FREContext ctx)
    {
        return;
    }

    void initializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer)
    {
        *ctxInitializer = &contextInitializer;
        *ctxFinalizer = &contextFinalizer;
    }

    //The runtime calls this function when it unloads an extension. However, the runtime does not guarantee that it will
    //unload the extension or call FREFinalizer().
    //it seems to be never called atleast on windows
    void finalizer(void* extData)
    {
        return;
    }
#ifdef __cplusplus
}
#endif
Реклама

, , , , ,

Оставить комментарий

Adobe Flex Compiler Shell

Не одни выходные потрачены на создание очередной хитрой штуки 🙂

Компилятор mxmlc удобен, если вы не пользуетесь Flex Builder‘ом, а например Intellij IDEA, в последней тоже есть поддержка mxml-компилятора, но этого не всегда достаточно. Однако скорость компиляции больших проектов оставляет желать лучшего. В тоже время Flex Builder компилирует шустрее. Все потому, что он использует fcsh.exe или Adobe Flex Compiler Shell, который является частью Flex SDK.

Работать с командной строкой неудобно, вот собственно для чего все  затевалось.

FCSH Server

Скриншот первой версии FCSH Server

Однако работа потребовала немного другого применения и все пришлось переделать. Проект состоял из множества swf модулей, которые естественно надо было часто пересобирать и для отладки. Причем не все, а лишь выбранные, поэтому приложение пришлось подружить с антом (Apache Ant).

Для компиляции я пользуюсь в основном панелью Ant Build в Intellij IDEA, можно конечно тоже самое делать и из консоли. В build.xml прописан ант-таск из jar-файла, который идет в комплекте с приложением, при запуске билда опрашивается порт (40000) . Если порт свободен значит запускается FCSH Server и обрабатывет команды анта, перенаправляя их fcsh.exe, если запущен — просто перенаправляет команды.

FCSH Server может конфигуриться через ini-файл (подробнее здесь), имеет свой лог компиляции, запоминает предыдущие команды, давая возможность перекомпилять через GUI-интерфейс.

FCSH Server

Скриншот финальной версии FCSH Server

Всех кого заинтересовал проет приглашаю скачать и попробовать самим: FCSH Server.

, , , ,

Оставить комментарий