最初の一歩ということで、慣例の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と関数定義
下記を追加します。
関数は、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; //コンテキストの初期化時の関数
*ctxFinalizerToSet = &ContextFinalizer; //コンテキストの破棄時の関数
}
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が完成です!
長くなったのでANE作成は次回へ!
参考資料
DLL
[...] 前回は、HellowWorldという文字列返す関数を定義してNative Extensionで使えるような定義をしたDLLを作成しました。 [...]
[...] 2. HelloWorldANE.hにincludeと関数定義 下記を追加します。 Native Extension用の関数については、ここをみてください。 [...]
[...] ADT Check 2 ANE 3 Platforms 4 Native C API Reference 5 ExtensionContext 6 Try Develop HelloWorld ANE DLL 7 Try Develop HelloWorld ANE SWC 8 Try Develop HelloWorld ANE AIR 9 Try Develop HelloWorld ANE EXE [...]
[...] 関数名は、Native Extension側で登録した関数名です。ここの5を参照 [...]
[...] 3. コンパイル & ANE作成 コンパイルとANE作成は、6と7を参照 [...]