1.FlashBuilder4.6とAnettyでiOSで動くANEサンプルアプリを作成する(リンク先へ)
2.SWCを作成する(リンク先へ)
3.aファイルを作成する(リンク先へ)
4.ANEttyでaneファイルを作成する(リンク先へ)
5.as3でサンプルファイルを作成する(リンク先へ)
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ファイルを作成します。
#importHelloWorldANE.m#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);
#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;
}
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();
}
}
}