posted by 열정개발자 2011/09/22 15:26

첫 번째 단계라고하는 것으로, 관례의 HelloWorld라는 문자를 생성하는 Native Extension을 만듭니다.

1. VS C + +에서 DLL을 만들 준비를합니다. 
이번에는 VS C + + 2010로 만듭니다. 
새 프로젝트> Win 32 응용 프로그램 마법사에서 DLL을 만듭니다.

프로젝트의 편지지가 생성되면 
AIR 3 HOME / include / FlashRuntimeExtensions.h 
AIR 3 HOME / lib / win / FlashRuntimeExtensions.lib 
을 참조하거나, 프로젝트 폴더에 복사합니다.

준비

2. stdafx.h에 include 함수 정의 <br /> 다음을 추가합니다. 
함수는 extern "C"__declspec (dllexport)를 사용합시다 
extern "C": C 언어 형식의 함수로 정의 
__declspec (dllexport) : DLL에서 내보낼 수 함수 정의

#include "FlashRuntimeExtensions.h" //반드시필요함
 
//초기화시 호출되는 함수
extern "C" __declspec(dllexport) void ExtInitializer(
    void** extDataToSet,
    FREContextInitializer* ctxInitializerToSet,
    FREContextFinalizer* ctxFinalizerToSet
);
 
//삭제시 호출되는 함수
extern "C" __declspec(dllexport) void ExtFinalizer(
    void* extData
);



3. 초기화 함수 ExtInitializer 구현
API에서 추측하면 컨텍스트 초기화 및 소멸 함수의 포인터를 등록해야.
 
__declspec(dllexport) void ExtInitializer(
    void** extDataToSet,
    FREContextInitializer* ctxInitializerToSet,
    FREContextFinalizer* ctxFinalizerToSet
) {
    *extDataToSet = NULL;
    *ctxInitializerToSet = &ContextInitializer; //context 초기화 함수
    *ctxFinalizerToSet = &ContextFinalizer; //contect 제거할때 함수
}

 

4. 폐기 함수 ExtFinalizer 구현
특별히 아무것도하지 않는다.
__declspec(dllexport) void ExtFinalizer(void* extData) {
    return;
}



5. 컨텍스트 초기화 함수 ContextInitializer 구현
이 함수는 포인터 참조이므로 C 언어 형식 필요 없음.
함수 인수는 FREContextInitializer 정의대로합니다.

컨텍스트 함수를 명명하고 등록하는 데 필요한.

FRENamedFunction에서 등록할 수 함수는 포인터이므로 C 언어 형식이 아닌 함수를등록합니다.
void 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*)"GetHelloWorld"; //함수명
    func[0].functionData = NULL; //함수 데이터
    func[0].function = &GetHelloWorld; //불리는 함수 FREFunction포인터
 
    *functionsToSet = func;
}

6. 컨텍스트를 제거할 때 함수 ContextFinalizer 구현
특별한건 없다.
void ContextFinalizer(FREContext ctx) {
return;
}



7. GetHelloWorld 함수 구현
GetHelloWorld 함수를 구현합니다.
인수는 FREFunction 형식에 맞춥니다.
FREObject GetHelloWorld(
    FREContext ctx,
    void* funcData,
    uint32_t argc,
    FREObject argv[]
) {
    const uint8_t* msg = (const uint8_t*)"Hello World";
 
    FREObject retObj;
    //문자열에서 FREObject를 만드는 함수 AS로 취급할 문자열
    FRENewObjectFromUTF8(strlen((const char*)msg)+1, msg, &retObj);
 
    return retObj;
} 

8. 컴파일
오류해야 Native Extension DLL 완성입니다! ??
 

dll참고