SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事(AD)

Flash Builder 4.6でAndroid/iOSデバイスのバイブレーター機能を実行するライブラリを作成!

各プラットフォームと連携できる AIR 3 新機能「ネイティブ拡張」の使い方

  • X ポスト
  • このエントリーをはてなブックマークに追加

ネイティブ C API

 続いて、ネイティブ C APIを使ったネイティブ拡張ライブラリの作成方法を説明します。

開発準備

 ネイティブ C APIを使って開発するには、次のヘッダーファイルが必要になります。

AIR 3 HOME/include/FlashRuntimeExtensions.h

 また、コンパイルする場合、次のライブラリファイルが必要になります。

必要なライブラリファイル
プラットフォーム ライブラリ
Android AIR 3 HOME/lib/ android/FlashRuntimeExtensions.so
Windows AIR 3 HOME/lib/win/FlashRuntimeExtensions.lib

 ヘッダーファイルには、AIRとネイティブコード間のインターフェイス、型、関数が定義されています。詳細については、ネイティブ C API リファレンス英語)を参照ください。

 今回は、ネイティブ C APIのサンプルとして、iPhoneのバイブレーター機能を実行させるネイティブ拡張ライブラリを作成していきます。

Cocoa Touch Static Libraryプロジェクト作成

 まず、XCode 4.1を使用してCocoa Touch Static Libraryプロジェクトを作成します。[File]-[New]-[New Project]を選択します。

 [Choose a template for your new project]ウィザードが開きます。「Cocoa Touch Static Library」を選択して[Next]ボタンをクリックします。

 [Product Name]に「VibratorANE」を入力し、プロジェクトを作成します。

 Cocoa Touch Static Libraryプロジェクトが作成できたら、ネイティブ C APIのFlashRuntimeExtensions.hを追加します。FlashRuntimeExtensions.hを追加するには、プロジェクトのコンテキストメニューから[Add Files to]を選択し、ファイルダイアログで「FlashRuntimeExtensions.h」を指定します。これで開発環境が整います。

ネイティブ拡張関数を作成

 ネイティブ拡張関数は、ヘッダーに定義されているFREFunction関数型で実装する必要があります。FREFunction関数型は、次のようになります。

ネイティブ拡張関数
関数型名 目的
FREFunction この関数型の引数と同じ関数を作成してその中にロジックを記述します。ActionScriptにデータを返したい場合は、FREObjectに変換して返り値にします。

引数名 目的
argc ネイティブ拡張関数の引数の数
argv ネイティブ拡張関数の引数の配列

作成例

 サンプルファイルでは、iOSのバイブレーター機能を呼び出す処理を実装しています。

iOS\VibratorANE\VibratorANE.m
id vibrator;

@implementation VibratorANE
- (void)vibrate {
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
@end

FREObject VibrateNow(FREContext ctx,void* funcData,uint32_t argc,FREObject arg[]){
    [vibrator vibrate];
    return NULL;
}

ネイティブ拡張コンテキストの初期化関数と破棄関数を作成

 ネイティブ拡張コンテキスト初期化関数破棄関数は、ネイティブ拡張の初期化時に必要です。この初期化関数を使用して、ネイティブ拡張コンテキストに登録するネイティブ拡張関数を指定できます。実装する関数型については、次のようになります。

ネイティブ拡張コンテキストの初期化関数型と破棄関数型
関数型名 目的
FREContextInitializer ネイティブ拡張コンテキストが初期化されるときに呼びだされる関数

引数名 目的
numFunctionsToTest ネイティブ拡張コンテキストに登録するネイティブ拡張関数の数を指定
functionsToSet ネイティブ拡張コンテキストに登録するネイティブ拡張関数配列を返す(型がFRENamedFunction、長さがnumFunctionsToTest)。この配列は、ネイティブ拡張コンテキスト内部で登録される
FRENamedFunction型は、ネイティブ拡張関数を登録する際に使用します。

引数名 目的
name ネイティブ拡張関数名を指定
functionData ネイティブ関数に渡すデータのポインタを指定
function ネイティブ関数のポインタを指定
FREContextFinalizer ネイティブ拡張コンテキストが破棄されるときに呼びだされる関数

作成例

 サンプルファイルでは、関数名VibrateNowとVibrateNowFunctionネイティブ拡張関数クラスのインスタンスを関連付けています。これによって、ActionScriptからVibrateNowをキーにしてVibrateNowFunctionネイティブ拡張関数を呼び出すことができます。

iOS\VibratorANE\VibratorANE.m
void ContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx,
                        uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet) {
    *numFunctionsToTest = 1;
    
    FRENamedFunction* funcs = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)*1);
    funcs[0].name = (const uint8_t*)"VibrateNow";
    funcs[0].functionData = NULL;
    funcs[0].function = &VibrateNow;
    
    *functionsToSet = funcs;

VibratorANE *selfRef = [[VibratorANE alloc] init];
    vibrator = selfRef;
}

void ContextFinalizer(FREContext ctx) {
[vibrator release];
    return;
}

ネイティブ拡張の初期化関数と破棄関数を作成

 ネイティブ拡張は、初期化関数と破棄関数をネイティブ拡張ライブラリに定義する必要があります。この初期化関数を使用して、ネイティブ拡張コンテキストの初期化関数と破棄関数を登録できます。また、この2つの関数は、ネイティブ拡張ごとに1組作成します。実装する関数型については、次のようになります。

ネイティブ拡張の初期化関数型と破棄関数型
関数型名 目的
FREInitializer ネイティブ拡張が初期化されるときに呼びだされる関数

引数名 目的
ctxInitializerToSet ネイティブ拡張コンテキスト初期化関数のポインタを指定
ctxFinalizerToSet ネイティブ拡張コンテキスト破棄関数のポインタを指定
ActionScriptのExtensionContext.createExtensionContext()を呼び出すことで実行されます。
FREFinalizer ネイティブ拡張が破棄されるときに呼びだされる関数。ActionScriptのExtensionContext.dispose()を呼び出すことで実行されます。

作成例

 サンプルファイルでは、ContextInitializer関数をネイティブ拡張コンテキストの初期化関数に、ContextFinalizer関数をネイティブ拡張コンテキストの破棄関数に指定しています。

iOS\VibratorANE\VibratorANE.m
void ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,
                    FREContextFinalizer* ctxFinalizerToSet) {
    *extDataToSet = NULL;
    *ctxInitializerToSet = &ContextInitializer;
    *ctxFinalizerToSet = &ContextFinalizer;
}

void ExtFinalizer(void* extData) {
    return;
}

aファイル作成

 Cocoa Touch Static Library Projectのビルドが通ると、次のような図になります。

作成例

 サンプルファイルでは、ビルドが成功するとlibVibratorANE.aが生成されます。このファイルをコピーしたい場合は、libVibratorANE.aのコンテキストメニューの[Show in Finder]をクリックしてFinderで開きます。

次のページ
ネイティブ拡張記述ファイルの作成

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

有川 榮一(アリカワ エイイチ)

 Arikawa Eiichi @ AKABANA ( http://akabana.net ) アーキテクト, クラスメソッド株式会社 プリンシパル。 Flex / AIR / CF / FMS / Java / C#を使ったアプリケーションソフトウェア設計と開発を中心に仕事をしています。また、Flex ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6308 2011/12/09 17:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング