ページへ戻る
印刷
iOSでのANEの作成/iOS側の作成
をテンプレートにして作成 ::
NJF Wiki
xpwiki
:iOSでのANEの作成/iOS側の作成 をテンプレートにして作成
開始行:
[[iOSでのANEの作成]]に戻る
ANEを作成するためには、iOS側のプログラムをまとめたスタテ...
この記事で使用しているXcodeのバージョンは9.2です。
*プロジェクトの作成
まずXcodeでテスト用にiOS端末上で実行するためのプロジェク...
具体的には、ボタンを押すとアラート画面が表示されるアプリ...
まずXcode起動後にメニューからFile->New->Projectと選び、iO...
&ref(newProject.jpg,mw:480,mh:360);クリックで拡大
プロジェクト名などを指定します。ここでは「AneAlertSample...
&ref(newProjectSetting.jpg,mw:480,mh:360);クリックで拡大
あとは適当な場所にプロジェクトを作成します。
プロジェクトが作成できたら、まずProjectの設定項目からInfo...
&ref(projectInfo.jpg,mw:480,mh:360); クリックで拡大
これを行わず、最新のバージョンを指定したままだと、64bitの...
次に「Build Settings」で「All」タブを選び、「Architecture...
&ref(BuildSettings.jpg,mw:480,mh:360);クリックして拡大。
特に「Build Active Architectures Only」を「No」にする事を...
他の項目は基本的にデフォルト値のままで大丈夫です。
*テスト用ボタンの配置
ANEの作成はけっこう面倒です。それを何度もやらなくてすむよ...
Xcodeでプロジェクトを作成すると、デフォルトでは「Safe are...
&ref(safeAreaError.jpg,mw:480,mh:360);クリックして拡大
iOS9にすればこのエラーは防げます。
もしiOS8のままで開発するなら、特に「Safe area」は利用しな...
そのために、まず「Main.storyboard」の「Safe Area」を選択...
&ref(safeArea.jpg,mw:480,mh:360);クリックして拡大
次にXcodeのウインドウの右上のボタンを、次にその下のタブの...
&ref(rightTop_0.jpg,mw:480,mh:360);
すると右端中段に「Interface Builder Document」という項目...
&ref(safeAreaCheck.jpg,mw:480,mh:360);クリックして拡大
「LaunchScreen.storyboard」の方も同様にして「Safe Area」...
次にテスト用のボタンを配置します。Xcode右下の部分の丸いア...
&ref(buttonTab.jpg,mw:480,mh:360);クリックして拡大
それを「Main.storyboard」のエディタにドラッグ&ドロップで...
サイズもボタンの端をドラッグすると調整できます。
真ん中寄せなどをしない場合、アプリの表示は左上が基準にな...
そのため、ボタンは左上の方に配置すると便利です。
&ref(buttonLocate.jpg,mw:480,mh:360);
テスト用なので、レイアウトや表示にこだわっても仕方があり...
エディタ上のボタンを選択状態にして、右上端のくさび形のア...
&ref(buttonLabel.jpg,mw:480,mh:360);
次にボタンを押したときの処理を定義します。
Xcodeのウインドウの右上にある丸いボタンを押して、Storyboa...
ViewController.mが表示されない場合は、エディタ上の「< >...
&ref(twoEditorBtn.jpg,mw:480,mh:360);
そして、ボタンをViewController.mの「@end」の上あたりにで...
すると以下のようなアクションの定義ウインドウが出ます。
&ref(actonDef.jpg,mw:480,mh:360);
Nameを「alertShowUp」とすると、その名前のメソッドがドラッ...
このメソッドがボタンが押されたとき(正確には押して離した...
たまに「Could not insert なんとか」というエラーが出るとき...
動作確認のために、このメソッドにログ出力の処理を追加しま...
- (IBAction)alertShowUp:(id)sender {
NSLog(@"alertShowUp");
}
これで実行してボタンを押すと
2018-01-05 21:49:46.619087+0900 AneAlertSample[30385:270...
などとXcodeの下部のログ表示部分に出力されれば、テスト用の...
*ANE用のライブラリの作成
このページの目的は作成したボタンを押すとアラート画面が表...
このままこのテスト用アプリのプロジェクトに処理を書くこと...
はじめからライブラリ用のプロジェクトを制作し、それを先ほ...
そのためにここでライブラリ用のプロジェクトを制作します。
まずXcode起動後にメニューからFile->New->Projectと選び、iO...
&ref(cctStaticLibrary.jpg,mw:480,mh:360);
この後のプロジェクトの作り方は「[[プロジェクトの作成>#kc3...
また、ターゲットのバージョンや「Build Settings」なども「[...
ちなみにライブラリプロジェクトをそのままビルドした場合は...
混乱しないように、両方同じにしておくのが無難です。
ライブラリプロジェクトが作成できたら、一度Xcodeを終了させ...
再びXcodeを開き、ライブラリプロジェクトを参照する親プロジ...
開いたらライブラリプロジェクトanealertをAneAlertSampleの...
&ref(libraryDD.jpg,mw:480,mh:360);
するとライブラリプロジェクトが入れ子となって表示されるよ...
&ref(libLink.jpg,mw:480,mh:360);
ちなみに、Xcodeを再起動せず、ライブラリプロジェクトを開い...
最後にライブラリをリンクさせるため、親プロジェクトであるA...
&ref(libLinkTarget.jpg,mw:480,mh:360);クリックして拡大
そして、ヘッダーファイルが参照できるように、同じく親プロ...
&ref(libHeader.jpg,mw:480,mh:360);
これで、ライブラリ開発とそれを使ったテスト用アプリの開発...
ただし、まれにビルドしようとしたときにライブラリプロジェ...
*主処理の追加とアプリとしてのテスト
ライブラリの中心となるアラート表示の部分と、テスト用にそ...
まず、アラートを表示する「anealert.m」の処理は以下の通り...
#import "anealert.h"
@interface AneAlert()
- (void)onYesButtonPressed;
@end
@implementation AneAlert
- (void) alertWindowInit{
if(alertController == nil){
NSLog(@"alertWindowInit");
alertController = [UIAlertController alertContro...
// Yes button
[alertController addAction:[UIAlertAction action...
[self onYesButtonPressed];
}]];
}
}
- (void) alertWindowShow:(NSString*)title : (NSString*)m...
NSLog(@"alertWindowShow");
id delegate = [[UIApplication sharedApplication] del...
UIWindow * win = [delegate window];
alertController.title = title;
alertController.message = message;
[win.rootViewController presentViewController:alertC...
}
- (void)onYesButtonPressed {
NSLog(@"onOtherButtonPressed");
}
@end
これに対応するanealert.hは以下の通りです。
#import <UIKit/UIKit.h>
@interface AneAlert : NSObject{
@private
UIAlertController *alertController;
UIViewController *viewController;
}
- (void) alertWindowInit;
- (void) alertWindowShow:(NSString*)title : (NSString*)m...
@end
基本的に通常のObjective-Cでのアラート表示の処理ですが、vi...
つい、AneAlertSampleプロジェクトの中のViewControllerを使...
この方法は画面表示を伴うANEの作成では必須と言えるほどよく...
これを呼び出すViewController.mの処理は、前述のボタンの処...
- (IBAction)alertShowUp:(id)sender {
NSLog(@"alertShowUp");
if(aneAlert == nil){
aneAlert = [[AneAlert alloc] init];
[aneAlert alertWindowInit];
cnt = 1;
}
NSString *message = [NSString stringWithFormat:@"%d ...
[aneAlert alertWindowShow:@"Ane Test from objective-...
cnt++;
}
また、ここで使う変数の定義も行います。
#import "ViewController.h"
#import "anealert.h"
@interface ViewController (){
AneAlert *aneAlert;
int cnt;
}
@end
これで実行すると、ボタンを押すたびにメッセ時の数字が変わ...
&ref(sciOS.jpg,mw:480,mh:360);
このように、ANEの作成では一度テスト用のアプリを作って実行...
そうではなく、いきなりANEとして作成してAirで動かそうとす...
*ANE呼び出し処理の追加
いよいよANEの呼び出し部分を作成します。この部分でエラーが...
まず、「Air SDK」のincludeフォルダの中にあるFlashRuntimeE...
&ref(flashrantimehDD.jpg,mw:480,mh:360);
そしてコピーします。
&ref(flashrantimecopy.jpg,mw:480,mh:360);
次に呼び出しのための関数などを定義するファイルを作成しま...
クラスなどを定義するわけではないので、Objective-Cの空ファ...
&ref(newFile.jpg,mw:480,mh:360);
名前はAneAlertCall.mとしました。
&ref(newEmptyFile.jpg,mw:480,mh:360);
ANEの作成には実際のネイティブな処理を行う関数の他に、次の...
+初期化関数
+コンテクストの初期化関数
+終了関数
このうち終了関数については、終了処理がないなら特に定義し...
この事を踏まえて、ANE呼び出し処理は以下のようになります。
#import <Foundation/Foundation.h>
#import "FlashRuntimeExtensions.h"
#import "anealert.h"
AneAlert * aneAlert;
FREObject ANEAlertShow(FREContext ctx, void* funcData, u...
NSLog(@"ANEAlertShow start");
uint32_t argLength; //引数の長さ
const uint8_t *argBuff; //引数の値保持用
FREGetObjectAsUTF8(argv[0], &argLength, &argBuff);//...
NSString *arg1NSString = [NSString stringWithUTF8Str...
FREGetObjectAsUTF8(argv[1], &argLength, &argBuff);//...
NSString *arg2NSString = [NSString stringWithUTF8Str...
if(aneAlert == nil){
NSLog(@"ANEAlertShow:init alert!");
aneAlert = [[AneAlert alloc] init];
[aneAlert alertWindowInit];
}
[aneAlert alertWindowShow: arg1NSString : arg2NSStri...
NSLog(@"ANEAlertShow end");
return NULL;
}
void ANEAlertContextInitializer(void* extData, const uin...
{
NSLog(@"ANEAlertContextInitializer start");
*numFunctionsToTest = 1;
FRENamedFunction* func = (FRENamedFunction*) malloc(...
func[0].name = (const uint8_t*) "alert";
func[0].functionData = NULL;
func[0].function = &ANEAlertShow;
*functionsToSet = func;
NSLog(@"ANEAlertContextInitializer end");
}
void ANEAlertInitializer(void** extDataToSet, FREContext...
NSLog(@"ANEAlertInitializer start");
*extDataToSet = NULL;
*ctxInitializerToSet = &ANEAlertContextInitializer;
NSLog(@"ANEAlertInitializer end");
}
ここでANEAlertInitializerが初期化処理です。この関数名はあ...
ANEAlertContextInitializerは呼び出し関数を定義しています。
ここではANEAlertShow関数を「alert」という文字列で呼び出せ...
ANEAlertShowがアラート表示する関数です。ここで引数の取得...
FREGetObjectAsUTF8を使っていますが、UTF8以外にも型に合わ...
詳しくは公式ドキュメント「[[ネイティブ C API リファレンス...
最後にAneAlertCall.mがちゃんとライブラリに含まれているか...
&ref(aneAlertComileS.jpg,mw:480,mh:360);
*ライブラリファイル(.aファイル)の取り出し
ここで作成したライブラリを取り出します。
まず実機をUSBで接続し、左上のテスト用の端末をその実機とし...
&ref(targetIpod.jpg,mw:480,mh:360);
こうしないとシミュレーター用のバイナリが書き出されること...
次にメニューのProductからBuildを選びます。
これでライブラリが作成されます。
少し余分に時間がかかりますが、場合によっては古いファイル...
&ref(buildClean.jpg,mw:480,mh:360);
Buildの時に以下のような警告がでますが気にしないでください。
&ref(FlashRuntimeExtensionCaution.jpg,mw:480,mh:360);
これはコメントの書き方のルールについてで、しかも場所はヘ...
Buildが正常に終われば、左側のProductのところにあるライブ...
メニューが現れるので「Show in Finder」を選択すればファイ...
もしライブラリがないと赤字で表示されるので、エラーを修正...
&ref(libane.jpg,mw:480,mh:360);
以上でライブラリの作成は終わりです。
[[iOSでのANEの作成/swcの作成]]に進む
[[iOSでのANEの作成]]に戻る
終了行:
[[iOSでのANEの作成]]に戻る
ANEを作成するためには、iOS側のプログラムをまとめたスタテ...
この記事で使用しているXcodeのバージョンは9.2です。
*プロジェクトの作成
まずXcodeでテスト用にiOS端末上で実行するためのプロジェク...
具体的には、ボタンを押すとアラート画面が表示されるアプリ...
まずXcode起動後にメニューからFile->New->Projectと選び、iO...
&ref(newProject.jpg,mw:480,mh:360);クリックで拡大
プロジェクト名などを指定します。ここでは「AneAlertSample...
&ref(newProjectSetting.jpg,mw:480,mh:360);クリックで拡大
あとは適当な場所にプロジェクトを作成します。
プロジェクトが作成できたら、まずProjectの設定項目からInfo...
&ref(projectInfo.jpg,mw:480,mh:360); クリックで拡大
これを行わず、最新のバージョンを指定したままだと、64bitの...
次に「Build Settings」で「All」タブを選び、「Architecture...
&ref(BuildSettings.jpg,mw:480,mh:360);クリックして拡大。
特に「Build Active Architectures Only」を「No」にする事を...
他の項目は基本的にデフォルト値のままで大丈夫です。
*テスト用ボタンの配置
ANEの作成はけっこう面倒です。それを何度もやらなくてすむよ...
Xcodeでプロジェクトを作成すると、デフォルトでは「Safe are...
&ref(safeAreaError.jpg,mw:480,mh:360);クリックして拡大
iOS9にすればこのエラーは防げます。
もしiOS8のままで開発するなら、特に「Safe area」は利用しな...
そのために、まず「Main.storyboard」の「Safe Area」を選択...
&ref(safeArea.jpg,mw:480,mh:360);クリックして拡大
次にXcodeのウインドウの右上のボタンを、次にその下のタブの...
&ref(rightTop_0.jpg,mw:480,mh:360);
すると右端中段に「Interface Builder Document」という項目...
&ref(safeAreaCheck.jpg,mw:480,mh:360);クリックして拡大
「LaunchScreen.storyboard」の方も同様にして「Safe Area」...
次にテスト用のボタンを配置します。Xcode右下の部分の丸いア...
&ref(buttonTab.jpg,mw:480,mh:360);クリックして拡大
それを「Main.storyboard」のエディタにドラッグ&ドロップで...
サイズもボタンの端をドラッグすると調整できます。
真ん中寄せなどをしない場合、アプリの表示は左上が基準にな...
そのため、ボタンは左上の方に配置すると便利です。
&ref(buttonLocate.jpg,mw:480,mh:360);
テスト用なので、レイアウトや表示にこだわっても仕方があり...
エディタ上のボタンを選択状態にして、右上端のくさび形のア...
&ref(buttonLabel.jpg,mw:480,mh:360);
次にボタンを押したときの処理を定義します。
Xcodeのウインドウの右上にある丸いボタンを押して、Storyboa...
ViewController.mが表示されない場合は、エディタ上の「< >...
&ref(twoEditorBtn.jpg,mw:480,mh:360);
そして、ボタンをViewController.mの「@end」の上あたりにで...
すると以下のようなアクションの定義ウインドウが出ます。
&ref(actonDef.jpg,mw:480,mh:360);
Nameを「alertShowUp」とすると、その名前のメソッドがドラッ...
このメソッドがボタンが押されたとき(正確には押して離した...
たまに「Could not insert なんとか」というエラーが出るとき...
動作確認のために、このメソッドにログ出力の処理を追加しま...
- (IBAction)alertShowUp:(id)sender {
NSLog(@"alertShowUp");
}
これで実行してボタンを押すと
2018-01-05 21:49:46.619087+0900 AneAlertSample[30385:270...
などとXcodeの下部のログ表示部分に出力されれば、テスト用の...
*ANE用のライブラリの作成
このページの目的は作成したボタンを押すとアラート画面が表...
このままこのテスト用アプリのプロジェクトに処理を書くこと...
はじめからライブラリ用のプロジェクトを制作し、それを先ほ...
そのためにここでライブラリ用のプロジェクトを制作します。
まずXcode起動後にメニューからFile->New->Projectと選び、iO...
&ref(cctStaticLibrary.jpg,mw:480,mh:360);
この後のプロジェクトの作り方は「[[プロジェクトの作成>#kc3...
また、ターゲットのバージョンや「Build Settings」なども「[...
ちなみにライブラリプロジェクトをそのままビルドした場合は...
混乱しないように、両方同じにしておくのが無難です。
ライブラリプロジェクトが作成できたら、一度Xcodeを終了させ...
再びXcodeを開き、ライブラリプロジェクトを参照する親プロジ...
開いたらライブラリプロジェクトanealertをAneAlertSampleの...
&ref(libraryDD.jpg,mw:480,mh:360);
するとライブラリプロジェクトが入れ子となって表示されるよ...
&ref(libLink.jpg,mw:480,mh:360);
ちなみに、Xcodeを再起動せず、ライブラリプロジェクトを開い...
最後にライブラリをリンクさせるため、親プロジェクトであるA...
&ref(libLinkTarget.jpg,mw:480,mh:360);クリックして拡大
そして、ヘッダーファイルが参照できるように、同じく親プロ...
&ref(libHeader.jpg,mw:480,mh:360);
これで、ライブラリ開発とそれを使ったテスト用アプリの開発...
ただし、まれにビルドしようとしたときにライブラリプロジェ...
*主処理の追加とアプリとしてのテスト
ライブラリの中心となるアラート表示の部分と、テスト用にそ...
まず、アラートを表示する「anealert.m」の処理は以下の通り...
#import "anealert.h"
@interface AneAlert()
- (void)onYesButtonPressed;
@end
@implementation AneAlert
- (void) alertWindowInit{
if(alertController == nil){
NSLog(@"alertWindowInit");
alertController = [UIAlertController alertContro...
// Yes button
[alertController addAction:[UIAlertAction action...
[self onYesButtonPressed];
}]];
}
}
- (void) alertWindowShow:(NSString*)title : (NSString*)m...
NSLog(@"alertWindowShow");
id delegate = [[UIApplication sharedApplication] del...
UIWindow * win = [delegate window];
alertController.title = title;
alertController.message = message;
[win.rootViewController presentViewController:alertC...
}
- (void)onYesButtonPressed {
NSLog(@"onOtherButtonPressed");
}
@end
これに対応するanealert.hは以下の通りです。
#import <UIKit/UIKit.h>
@interface AneAlert : NSObject{
@private
UIAlertController *alertController;
UIViewController *viewController;
}
- (void) alertWindowInit;
- (void) alertWindowShow:(NSString*)title : (NSString*)m...
@end
基本的に通常のObjective-Cでのアラート表示の処理ですが、vi...
つい、AneAlertSampleプロジェクトの中のViewControllerを使...
この方法は画面表示を伴うANEの作成では必須と言えるほどよく...
これを呼び出すViewController.mの処理は、前述のボタンの処...
- (IBAction)alertShowUp:(id)sender {
NSLog(@"alertShowUp");
if(aneAlert == nil){
aneAlert = [[AneAlert alloc] init];
[aneAlert alertWindowInit];
cnt = 1;
}
NSString *message = [NSString stringWithFormat:@"%d ...
[aneAlert alertWindowShow:@"Ane Test from objective-...
cnt++;
}
また、ここで使う変数の定義も行います。
#import "ViewController.h"
#import "anealert.h"
@interface ViewController (){
AneAlert *aneAlert;
int cnt;
}
@end
これで実行すると、ボタンを押すたびにメッセ時の数字が変わ...
&ref(sciOS.jpg,mw:480,mh:360);
このように、ANEの作成では一度テスト用のアプリを作って実行...
そうではなく、いきなりANEとして作成してAirで動かそうとす...
*ANE呼び出し処理の追加
いよいよANEの呼び出し部分を作成します。この部分でエラーが...
まず、「Air SDK」のincludeフォルダの中にあるFlashRuntimeE...
&ref(flashrantimehDD.jpg,mw:480,mh:360);
そしてコピーします。
&ref(flashrantimecopy.jpg,mw:480,mh:360);
次に呼び出しのための関数などを定義するファイルを作成しま...
クラスなどを定義するわけではないので、Objective-Cの空ファ...
&ref(newFile.jpg,mw:480,mh:360);
名前はAneAlertCall.mとしました。
&ref(newEmptyFile.jpg,mw:480,mh:360);
ANEの作成には実際のネイティブな処理を行う関数の他に、次の...
+初期化関数
+コンテクストの初期化関数
+終了関数
このうち終了関数については、終了処理がないなら特に定義し...
この事を踏まえて、ANE呼び出し処理は以下のようになります。
#import <Foundation/Foundation.h>
#import "FlashRuntimeExtensions.h"
#import "anealert.h"
AneAlert * aneAlert;
FREObject ANEAlertShow(FREContext ctx, void* funcData, u...
NSLog(@"ANEAlertShow start");
uint32_t argLength; //引数の長さ
const uint8_t *argBuff; //引数の値保持用
FREGetObjectAsUTF8(argv[0], &argLength, &argBuff);//...
NSString *arg1NSString = [NSString stringWithUTF8Str...
FREGetObjectAsUTF8(argv[1], &argLength, &argBuff);//...
NSString *arg2NSString = [NSString stringWithUTF8Str...
if(aneAlert == nil){
NSLog(@"ANEAlertShow:init alert!");
aneAlert = [[AneAlert alloc] init];
[aneAlert alertWindowInit];
}
[aneAlert alertWindowShow: arg1NSString : arg2NSStri...
NSLog(@"ANEAlertShow end");
return NULL;
}
void ANEAlertContextInitializer(void* extData, const uin...
{
NSLog(@"ANEAlertContextInitializer start");
*numFunctionsToTest = 1;
FRENamedFunction* func = (FRENamedFunction*) malloc(...
func[0].name = (const uint8_t*) "alert";
func[0].functionData = NULL;
func[0].function = &ANEAlertShow;
*functionsToSet = func;
NSLog(@"ANEAlertContextInitializer end");
}
void ANEAlertInitializer(void** extDataToSet, FREContext...
NSLog(@"ANEAlertInitializer start");
*extDataToSet = NULL;
*ctxInitializerToSet = &ANEAlertContextInitializer;
NSLog(@"ANEAlertInitializer end");
}
ここでANEAlertInitializerが初期化処理です。この関数名はあ...
ANEAlertContextInitializerは呼び出し関数を定義しています。
ここではANEAlertShow関数を「alert」という文字列で呼び出せ...
ANEAlertShowがアラート表示する関数です。ここで引数の取得...
FREGetObjectAsUTF8を使っていますが、UTF8以外にも型に合わ...
詳しくは公式ドキュメント「[[ネイティブ C API リファレンス...
最後にAneAlertCall.mがちゃんとライブラリに含まれているか...
&ref(aneAlertComileS.jpg,mw:480,mh:360);
*ライブラリファイル(.aファイル)の取り出し
ここで作成したライブラリを取り出します。
まず実機をUSBで接続し、左上のテスト用の端末をその実機とし...
&ref(targetIpod.jpg,mw:480,mh:360);
こうしないとシミュレーター用のバイナリが書き出されること...
次にメニューのProductからBuildを選びます。
これでライブラリが作成されます。
少し余分に時間がかかりますが、場合によっては古いファイル...
&ref(buildClean.jpg,mw:480,mh:360);
Buildの時に以下のような警告がでますが気にしないでください。
&ref(FlashRuntimeExtensionCaution.jpg,mw:480,mh:360);
これはコメントの書き方のルールについてで、しかも場所はヘ...
Buildが正常に終われば、左側のProductのところにあるライブ...
メニューが現れるので「Show in Finder」を選択すればファイ...
もしライブラリがないと赤字で表示されるので、エラーを修正...
&ref(libane.jpg,mw:480,mh:360);
以上でライブラリの作成は終わりです。
[[iOSでのANEの作成/swcの作成]]に進む
[[iOSでのANEの作成]]に戻る
ページ名: