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
Реклама

, , , , ,

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

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: