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

마지막 은 HellowWorld 문자열 반환하는 함수를 정의하고 Native Extension에서 사용할 수 있도록 정의를 DLL을 만들었습니다.

이번에는 ANE - SWC를 만듭시다. 
ANE - SWC는 ANE을 만들 때 필요한 SWC입니다. 
기본적으로이 SWC 속에 DLL 등으로 만든 Native Extension을 호출하는 클래스를 넣습니다.

1. Native Extension을 호출 클래스 <br /> 이전 만든 Native Extension의 GetHelloWorld 함수를 호출하는 간단한 클래스입니다. 
컴파일 SWC를 만들어 둡니다.

package net.akb7.air.extension
{
    import flash.external.ExtensionContext;
 
    public class HelloWorldExtension
    {
        private var context:ExtensionContext;
 
        public function HelloWorldExtension() {
            context = ExtensionContext.createExtensionContext("nativeExtension", "type");        }
 
 
        public function GetHelloWorld() : String {
            return "> "+context.call("GetHelloWorld") as String;
        }
 
        public function dispose() : void {
            return context.dispose();
        }
    }
}

2. AIR extension descriptor file 작성
Native Extension에 대한 설명을 작성합니다.
nativeLibrary
이전 만든 Native Extension DLL의 경로

initializer
여기에서 Native Extension 초기화 함수를 정의합니다.
nativeLibrary에 지정된 DLL에서 문자열 찾기 위해 C 언어 형식 함수에 필요.
<extension xmlns="http://ns.adobe.com/air/extension/2.5">
    <id>nativeExtension</id>
    <versionNumber>1.0.0</versionNumber>
    <platforms>
        <platform name="Windows-x86">
            <applicationDeployment>
                <nativeLibrary>HelloWorldExtension.dll</nativeLibrary>
                <initializer>ExtInitializer</initializer>
                <finalizer>ExtFinalizer</finalizer>
            </applicationDeployment>
        </platform>
    </platforms>
</extension>


3. ANE 생성
다음과 같은 ADT 명령 ANE 완성됩니다.
ANE 배포할 때 AIR 코드 서명 인증서를 사용해야합니다.

ane 만들기위한 ADT 옵션에 대해서는 여기를 참조

예 1) 현재 폴더에 필요한 파일이있는 경우 파일 지정
   
adt -package -storetype pkcs12 -keystore test.p12 -target ane HelloWorldExtension.ane extension.xml -swc bin\HelloWorldExtensionANE.swc -platform Windows-x86 library.swf HelloWorldExtension.dll


예 2) platform 하위에 필요한 파일이 있을 때
adt -package -storetype pkcs12 -keystore test.p12 -target ane HelloWorldExtension.ane extension.xml -swc bin\HelloWorldExtensionANE.swc -platform Windows-x86 -C platform\win library.swf HelloWorldExtension.dll 


예 3) platform 하위에 필요한 파일이 있을 때 디렉토리 지정
adt -package -storetype pkcs12 -keystore test.p12 -target ane HelloWorldExtension.ane extension.xml -swc bin\HelloWorldExtensionANE.swc -platform Windows-x86 -C platform\win . 



완성된, HelloWorldExtension.ane 다음 씁니다.

4. ANE 내용
ANE MIME application / vnd.adobe.air - native - extension - package + zip입니다.
ANE ZIP 형식입니다. 압축하여 봅시다.
SWC + Native Extension이라는 느낌입니다.

- catalog.xml
- library.swf
- mimetype
+ META - INF
- signatures.xml
- + ANE
- extension.xml
- + Windows - x86
- HelloWorldExtension.dll
- library.swf
 
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참고 
posted by 열정개발자 2011/09/22 15:17

ExtensionContext는 AIR에서 기본 라이브러리에있는 함수를 호출하는 클래스입니다. 
엄밀히 말하면, FREContext에 등록한 이름과 연관되는 함수를 호출합니다.

다음 예제와 같이 ANExtension는 extensionID을 가진 Native Extension에 액세스하는 데 
ExtensionContext.createExtensionContext를 사용하여 인스턴스를 취득하고 있습니다.

package com.example {
    public class ANExample extends EventDispatcher {
 
        private var extContext:ExtensionContext;
 
        public function ANExample() {
            extContext = ExtensionContext.createExtensionContext("ANExtension", "type");
        }
 
    }
}


다음 함수를 호출하는 경우입니다.
ExtensionContext 인스턴스 call 함수를 사용하여 호출합니다.

ExtensionContext.call 함수
 1 인수가 함수 이름
 2 인수가 함수 인수

함수 이름은 Native Extension 측에서 등록한 함수 이름입니다. 여기에서 5 참조
 

package com.example {
    public class ANExample extends EventDispatcher {
 
        private var extContext:ExtensionContext;
 
        public function getData(args:Array):String {
           return extContext.call("getData",args);
        }
    }
}


다음 상태 이벤트를 검색합니다.
Native Extension 측에서 FREDispatchStatusEventAsync ()를 호출
ExtensionContext 인스턴스 상태 이벤트가 발생합니다.

package com.example {
    public class ANExample extends EventDispatcher {
 
        private var extContext:ExtensionContext;
 
        public function ANExample() {
             extContext = ExtensionContext.createExtensionContext("ANExtension", "type");
       extContext.addEventListener(StatusEvent.STATUS, onStatus);
        }
 
        public function onStatus(event:StatusEvent):void {
            dispatchEvent (new Event (event.level) );
        }
    }
}

상태 이벤트는 스레드를 사용한 비동기 처리 종료 등을 알리는 데 유용하다.