2012年6月29日金曜日

FlashBuilder4.6とAnettyでiOSで動くANEサンプルアプリのまとめ

まとめました。
1.FlashBuilder4.6とAnettyでiOSで動くANEサンプルアプリを作成する(リンク先へ)
2.SWCを作成する(リンク先へ)
3.aファイルを作成する(リンク先へ)
4.ANEttyでaneファイルを作成する(リンク先へ)
5.as3でサンプルファイルを作成する(リンク先へ)

as3でサンプルファイルを作成する

ActionScript モバイルプロジェクトを選択します。
プロジェクト名は、HelloWorldMobileにします。
作成したSWCファイルを追加します。
作成したANEファイルを追加します。

package {
 import example.ane.HelloWorldExtension;

 import flash.display.Sprite;
 import flash.display.StageAlign;
 import flash.display.StageScaleMode;
 import flash.events.Event;
 import flash.events.MouseEvent;
 import flash.text.TextField;
 import flash.text.TextFormat;

 [SWF(width = '320', height = '480', backgroundColor = '#000000', frameRate = '60')]//iPhone3GS
 public class HelloWorldMobile extends Sprite
 {
  private var _text:TextField;
  private var extension:HelloWorldExtension = new HelloWorldExtension();

  public function HelloWorldMobile()
  {
   super();
   stage.align = StageAlign.TOP_LEFT;
   stage.scaleMode = StageScaleMode.NO_SCALE;
   addEventListener(Event.ADDED_TO_STAGE,addedToStageHandler);
  }

  protected function addedToStageHandler(event:Event):void
  {
   removeEventListener(Event.ADDED_TO_STAGE,addedToStageHandler);
   main();
  }

  private function main():void
  {
   //Button
   var blueBox:Sprite = box(0x0000ff,100,32);
   blueBox.addEventListener(MouseEvent.CLICK,blueBoxClickHandler);
   addChild(blueBox);
   //Text
   _text = textField();
   _text.width = stage.stageWidth;
   _text.y = blueBox.height;
   addChild(_text);
  }

  protected function blueBoxClickHandler(event:MouseEvent):void
  {
   _text.text = extension.getHelloWorld();
  }

  private function box(color:uint,_width:Number,_height:Number=0):Sprite
  {
   _height ||= _width;
   var _sprite:Sprite = new Sprite();
   _sprite.graphics.beginFill(color);
   _sprite.graphics.drawRect(0,0,_width,_height);
   _sprite.graphics.endFill();
   return _sprite;
  }

  private function textField():TextField
  {
   var textFormat:TextFormat = new TextFormat();
   textFormat.color = 0xffffff;
   textFormat.size = 24;
   textFormat.font = "DroidSans";

   var textField:TextField = new TextField();
   textField.defaultTextFormat = textFormat;

   return textField;
  }
 }
}
ビルドに成功したら、次はリリースビルドを行いipaファイルを作成します。
ipaファイルを作成する為に
電子署名ファイルの設定ネイティブエクステンションの設定を行います。

ipaファイルが正常に出力したらiOS端末で試してみましょう。

ANEttyでaneファイルを作成する

項目が必要な箇所は

ExtensionID example.ane
VersionNumber 1.0.0
SWC Path (swcをビルドしたファイルパス)
Export Path (aneを出力するファイルパス)
PlatformiPhone-ARMにチェックを入れます
iPhone-ARMの設定として
NativeLibraryPath (.aファイルを出力したファイルパス)
Initializer ExtInitializer
Finalizer ExtFinalizer

になります。

項目が必要な箇所は

ADTPath (air3.3のadtファイルパス)
CertificationFile Path (証明書ファイルを作成したパス)
Certification Password (証明書ファイルのパスワード)
証明書ファイルはCreate New Certifiacation Fileボタンまたは、
FlashBuilderでも作成する事ができます。

設定が終了したら、Start Compileボタンを押します。

.aファイルを作成する

CocoaTouchStaticLibraryを使用します。
下記ソース FlashRuntimeExtensions.hをインクルードします。
このファイルはFlashBuilder4.6includeディレクトリにあります。 
例)/Applications/Adobe Flash Builder 4.6/sdks/air3_3/include
HelloWorldANE.h
一行目の表示は#import <Foundation/Foundation.h>になります。
#import 
#import "FlashRuntimeExtensions.h"

@interface HelloWorldANE : NSObject

@end

FREObject GetHelloWorld(
                        FREContext ctx,
                        void* funcData,
                        uint32_t argc,
                        FREObject arg[]
                        );

void ContextInitializer(
                        void* extData,
                        const uint8_t* ctxType,
                        FREContext ctx,
                        uint32_t* numFunctionsToTest,
                        const FRENamedFunction** functionsToSet
                        );

void ContextFinalizer(FREContext ctx);

void ExtInitializer(
                    void** extDataToSet,
                    FREContextInitializer* ctxInitializerToSet,
                    FREContextFinalizer* ctxFinalizerToSet
                    );

void ExtFinalizer(void* extData);
HelloWorldANE.m
#import "FlashRuntimeExtensions.h"
#import "HelloWorldANE.h"

@implementation HelloWorldANE

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }
    
    return self;
}

@end

FREObject GetHelloWorld(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
    
    const char *str = "HelloWorld";
    
    FREObject retStr;
    FRENewObjectFromUTF8(strlen(str)+1, (const uint8_t *)str, &retStr);

    return retStr;
}

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;
    
    *functionsToSet = func;
}

void ContextFinalizer(FREContext ctx) {
    return;
}

void ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,
                    FREContextFinalizer* ctxFinalizerToSet) {
    *extDataToSet = NULL;
    *ctxInitializerToSet = &ContextInitializer;
    *ctxFinalizerToSet = &ContextFinalizer;
}

void ExtFinalizer(void* extData) {
    return;
}

SWCを作成する

プロジェクト名:HelloWorldExtensionで作成します。
SDKAIR 3.3を使用します。
package example.ane
{
 import flash.events.EventDispatcher;
 import flash.external.ExtensionContext;
 import flash.system.Capabilities;

 public class HelloWorldExtension extends EventDispatcher
 {
  private var context:ExtensionContext;

  public function HelloWorldExtension()
  {
   context=ExtensionContext.createExtensionContext("example.ane", "type");
  }

  public function getHelloWorld():String
  {
   try{
    return context.call("GetHelloWorld") as String;
   } catch(e:Error){
   }
   return null;
  }

  public function dispose():void
  {
   return context.dispose();
  }
 }
}

FlashBuilder4.6とAnettyでiOSで動くANEサンプルアプリを作成する

1.サンプルアプリの内容
Spriteで作成した青い矩形をタッチした時にその下にHelloWorldと表示します。
FlashBuilder上でデバッグ起動をしても、落ちてしまいますので注意して下さい。

2.環境
AIR 3.3を使用します。
実行環境 MacOSX 10.7.4
開発環境 FlashBuilder 4.6
開発環境 XCode Version 4.3.1
ANE作成支援ツール ANEtty 0.0.3
iOS Developer Programに参加している必要があります。

3.参考にさせて頂いたホームページ
Flash Builder 4.6でネイティブ拡張(Native Extensions)を使ってみよう (リンク先へ)
ANE制作ツール「ANEtty」(リンク先へ)