ネイティブ 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に変換して返り値にします。
  | 
        
作成例
サンプルファイルでは、iOSのバイブレーター機能を呼び出す処理を実装しています。
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 | 
            ネイティブ拡張コンテキストが初期化されるときに呼びだされる関数
 
  | 
        ||||||||||||||
| FREContextFinalizer | ネイティブ拡張コンテキストが破棄されるときに呼びだされる関数 | 
作成例
サンプルファイルでは、関数名VibrateNowとVibrateNowFunctionネイティブ拡張関数クラスのインスタンスを関連付けています。これによって、ActionScriptからVibrateNowをキーにしてVibrateNowFunctionネイティブ拡張関数を呼び出すことができます。
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 | 
            ネイティブ拡張が初期化されるときに呼びだされる関数
  | 
        ||||||
| FREFinalizer | ネイティブ拡張が破棄されるときに呼びだされる関数。ActionScriptのExtensionContext.dispose()を呼び出すことで実行されます。 | 
作成例
サンプルファイルでは、ContextInitializer関数をネイティブ拡張コンテキストの初期化関数に、ContextFinalizer関数をネイティブ拡張コンテキストの破棄関数に指定しています。
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で開きます。

              
              
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                          
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
															
														
															
														
															
														
    
    
    
    
    
													
													
													
													
													
										
									

                    