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) );
        }
    }
}

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

 

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

Native Extension의 네이티브 라이브러리를 만들 때 필요한 함수 및 형식에 대한 문서입니다. 
DevelopingActionScriptExtensionsForAdobeAIR.pdf 
Chapter 6 : Native C API Reference

타입

FREContext
FREObject
FREBitmapData
FREByteArray

함수

FREFunction
FRENamedFunction
FREContextInitializer
FREContextFinalizer
FREInitializer
FREFinalizer

열거형
FREResult
FREObjectType


모두는, AIR 3 HOME / include / FlashRuntimeExtensions.h 있습니다.
또한 Windows 컴파일을위한 라이브러리가 필요합니다.
그것은 AIR 3 HOME / lib / win / FlashRuntimeExtensions.lib 있습니다.
 
 

 

posted by 열정개발자 2011/09/22 15:11
AIR 3에 포함되어있는 새로운 adt.jar에 com.adobe.air.Platforms라는 클래스가있었습니다. 
이것은 Native Extension의 대상 플랫폼 문자열 같은입니다.

import com.adobe.air.Platforms;
 
public class PlatformsDump {
    public static void main(String[] args) {
        System.out.println(Platforms.WIN_X86);
        System.out.println(Platforms.MAC_X86);
        System.out.println(Platforms.ANDROID_ARM);
        System.out.println(Platforms.IPHONE_ARM);
    }
}

결과
 
iPhone-ARM  
Windows-x86
MacOS-x86
Android-ARM


AIR extension descriptor file에서 플랫폼 이름을 지정할 때 사용합시다.
DevelopingActionScriptExtensionsForAdobeAIR.pdf  

DevelopingActionScriptExtensionsForAdobeAIR.pdf
Chapter 5 : AIR extension descriptor file에 대해 설명합니다.
 
<extension xmlns="http://ns.adobe.com/air/extension/2.5">
    <id>nativeExtension</id>
    <versionNumber>1.0.0</versionNumber>
    <platforms>
        <platform name="プラットフォーム名">
            <applicationDeployment>
                <nativeLibrary>AIR확장DLL</nativeLibrary>
                <initializer>초기화함수</initializer>
                <finalizer>삭제시함수</finalizer>
            </applicationDeployment>
        </platform>
    </platforms>
</extension>
 
posted by 열정개발자 2011/09/22 15:08

ANE 파일은 AIR Native Extension 파일입니다. 
이 동안 SWF 또는 DLL이나 ANE 정의 파일이 들어 있습니다. 
일반 SWC로 빌드 지정할 수 있습니다.


만드는 방법

1. AIR 확장 DLL을 만드는 
ANE의 DLL은 VSC + +로 만들 수 있습니다. 
그 때이 두 파일은 중요합니다. 
AIR 3 HOME / include / FlashRuntimeExtensions.h 
AIR 3 HOME / lib / win / FlashRuntimeExtensions.lib 
작업 디렉터리로 복사 또는 연결하십시오.

2. AIR extension descriptor file을 만듭니다. 
ANE 어떤 것이라고 설명하고있는 느낌입니다. 
플랫폼마다 네이티브 라이브러리를 지정합니다. 
응용 프로그램 설명자 파일과 유사하네요.

<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>AIRを拡張するDLL</nativeLibrary>
                <initializer>初期化時関数</initializer>
                <finalizer>破棄時関数</finalizer>
            </applicationDeployment>
        </platform>
    </platforms>
</extension>

3. ANE - SWC 만들
AIR 확장하는 네이티브 라이브러리를 호출하는 AS 클래스가 들어있는 SWC입니다.
flash.external.ExtensionContext # call 사용하여 DLL 함수를 호출하는 클래스 제공합니다.
Flex 라이브러리 프로젝트에서 SWC 만듭니다. 나는 이것을 ANE - SWC라고합니다.

4. ANE 
ADT를 사용하여 ANE 만듭니다.

adt -package SIGNING_OPTIONS -target ane <output-package> <ext-desc> ANE_OPTIONS

[예]
adt
-package
-storetype pkcs12
-keystore test.p12
-target ane
AIRを拡張するDLLのパス
extension.xml
-swc ANE-SWC
-platform プラットフォーム名
-C platform\win . 
 
 

 

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

먼저 ADT 버전을 AIR 3 RC에서 확인합니다.

> adt - version 
3.0.0.3880

> adt - help

usage:
  adt -checkstore SIGNING_OPTIONS
  adt -certificate -cn <name> ( -ou <org-unit> )? ( -o <org-name> )? ( -c <country> )? ( -validityPeriod <years> )? ( 1024-RSA | 2048-RSA ) <pfx-file> <password>
  adt -help
  adt -migrate SIGNING_OPTIONS ( <air-file-in> | <airn-file-in> ) <output-file>
  adt -package SIGNING_OPTIONS ( -target air )? <output-package> ( <app-desc> FILE_OPTIONS | <input-package> )
  adt -package SIGNING_OPTIONS -target airn <output-package> ( <app-desc> FILE-AND-PATH-OPTIONS | <input-package> )
  adt -package -target ( apk | apk-debug | apk-emulator | apk-captive-runtime ) ( CONNECT_OPTIONS? | -listen <port>? ) ( -airDownloadURL <url> )? SIGNING_OPTIONS <output-package> ( <app-desc> PLATFORM-SDK-OPTION? FILE-AND-PATH-OPTIONS | <input-package> PLATFORM-SDK-OPTION? )
  adt -package -target ( ipa-test | ipa-debug | ipa-app-store | ipa-ad-hoc | ipa-test-interpreter | ipa-debug-interpreter ) CONNECT_OPTIONS? SIGNING_OPTIONS <output-package> ( <app-desc> FILE-AND-PATH-OPTIONS | <input-package> )
  adt -package SIGNING_OPTIONS? -target native SIGNING_OPTIONS? <output-package> ( <app-desc> FILE-AND-PATH-OPTIONS | <input-package> )
  adt -package SIGNING_OPTIONS? -target bundle SIGNING_OPTIONS? <output-package> ( <app-desc> FILE-AND-PATH-OPTIONS | <input-package> )
  adt -package SIGNING_OPTIONS -target ane <output-package> <ext-desc> ANE_OPTIONS
  adt -prepare <airi-file> <app-desc> FILE_AND_PATH_OPTIONS
  adt -sign SIGNING_OPTIONS ( -target ( air | airn | ane ) )? ( <airi-file> | <unsigned-ane-file> ) <output-file>
  adt -installRuntime   PLATFORM-OPTION PLATFORM-SDK-OPTION? ( -device <deviceID> )? ( -package <apk-file> )?
  adt -installApp       PLATFORM-OPTION PLATFORM-SDK-OPTION? ( -device <deviceID> )? -package <apk-file>
  adt -uninstallRuntime PLATFORM-OPTION PLATFORM-SDK-OPTION? ( -device <deviceID> )?
  adt -uninstallApp     PLATFORM-OPTION PLATFORM-SDK-OPTION? ( -device <deviceID> )? -appid <app-id>
 
  adt -launchApp        { PLATFORM-OPTION PLATFORM-SDK-OPTION? ( -device <deviceID> )? ( -debuggerPort port )? -appid <app-id> }
  adt -runtimeVersion   PLATFORM-OPTION PLATFORM-SDK-OPTION? ( -device <deviceID> )?
  adt -appVersion       PLATFORM-OPTION PLATFORM-SDK-OPTION? ( -device <deviceID> )? -appid <app-id>
 
  adt -version
 
SIGNING_OPTIONS      : -storetype <type> ( -keystore <store> )? ( -storepass <pass> )? ( -alias <aliasName> )? ( -keypass <pass> )? ( -providerName <name> )? ( -tsa <url> )? ( -provisioning-profile <profile> )?
FILE_OPTIONS         : <fileOrDir>* ( ( -C <dir> <fileOrDir>+ ) | ( -e <file> <path> ) )*
CONNECT_OPTIONS      : -connect <host>
ANE_OPTIONS          : -swc <swc> ( -platform <name> <fileOrDir>* ( -C <dir> <fileOrDir>+ )* )*
FILE-AND-PATH-OPTIONS: ( PATH-OPTION | FILE-OPTIONS ) FILE-AND-PATH-OPTIONS?
PATH-OPTION          : -extdir <dir>
PLATFORM-OPTION      : -platform android
PLATFORM-SDK-OPTION  : -platformsdk <platform-sdk-home-dir>

extdir 포인트군요.
extdir에는 AIR Native Extension (. ANE) 파일을 넣어 두는 디렉토리입니다.
 

 

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

Native Extension이란? 
지금까지 AIR는 확장성을 폐쇄했습니다. 
AIR2에서 NativeProcess가 등장하여 네이티브 애플 리케이션과의 연계는 수 있었지만 사용 용도는 제한적인 것이었습니다.

그런데, AIR3은 새로운 시대의 개막입니다. 
그 최대의 중심이되는 기능이 Native Extension입니다. 
Native Extension 개발자가 네이티브 코드에서 구현된 ActionScript 라이브러리를 만들 수 있습니다.

이 Native Extension을 사용하여 AIR 3은 플랫폼 의존의 기능을 최대한 활용할 수 있습니다. 
데스크탑은 데이터베이스 연계 장치 연동 모바일장치의 전화번호부 및 센서류 및 Bluetooth 연동 등이 가능해집니다.