ページへ戻る

− Links

 印刷 

AndroidでのANEの作成​/Android側の作成 のバックアップの現在との差分(No.3) :: NJF Wiki

xpwiki:AndroidでのANEの作成/Android側の作成 のバックアップの現在との差分(No.3)

« Prev[4]  Next »[5]
3: 2016-06-25 (土) 14:26:23 njf[6] ソース[7] バックアップ No.3 を復元して編集[8]
Rewound to 2 ages ago. at 2016-06-25 (土) 20:10:51
現: 2018-01-04 (木) 22:28:37 njf[6] ソース[9] 編集[10]
Line 1: Line 1:
 +[[AndroidでのANEの作成]]に戻る。
 +
ANEを作成するためには、Android側のプログラムをまとめたjarファイルが必要となります。その制作方法やテストの仕方をこちらでご紹介します。 ANEを作成するためには、Android側のプログラムをまとめたjarファイルが必要となります。その制作方法やテストの仕方をこちらでご紹介します。
-**プロジェクトの作成 [#v878cca4] +*プロジェクトの作成 [#v878cca4] 
-まずAndroid Studioでプロジェクトを作成します。 +まずAndroid Studioでテスト用にAndroidで実行するためのプロジェクトを作成します。 
-Android Studio起動後に「Start a new Android Studio project」を選択します。+具体的には、ボタンを押すとアラート画面が表示されるアプリです。 
 + 
 +まずAndroid Studio起動後に「Start a new Android Studio project」を選択します。
&ref(asstart.jpg,mw:480,mh:360); &ref(asstart.jpg,mw:480,mh:360);
-次にApplication nameを指定します。ここでは「AneAlertSample」としています。+次にApplication nameを指定します。ここでは「AneAlertSample」としています。ドメイン名はパッケージ名のいつものくせで「jp.njf」としたらひっくり返されました。
&ref(newproject.jpg,mw:480,mh:360); &ref(newproject.jpg,mw:480,mh:360);
Line 27: Line 31:
ひとまず、この状態で問題が無いかAndroidにつなげてみて実行して、なにもない画面が表示されるか試してみることをお勧めします。 ひとまず、この状態で問題が無いかAndroidにつなげてみて実行して、なにもない画面が表示されるか試してみることをお勧めします。
-**テスト用ボタンの設置 [#gf75d92b] +*テスト用ボタンの設置 [#gf75d92b] 
-ANEの作成はけっこう面倒なので、Android上で出来るテストは出来るだけ行ってから、ANEの作成にうつった方が効率的です。そのためのテスト用ボタンを設置します。+ANEの作成はけっこう面倒です。それを何度もやらなくてすむように、Android上でテストはできるだけ行ってから、ANEの作成にうつった方が効率的です。そのためのテスト用ボタンを設置します。
まず、左側のナビゲーションから「aap/res/layout/activity_main.xml」を選択します。 まず、左側のナビゲーションから「aap/res/layout/activity_main.xml」を選択します。
Line 50: Line 54:
これでボタンの設置は終了です。実行してみると押してもなにも起こらないボタンが表示されるはずです。 これでボタンの設置は終了です。実行してみると押してもなにも起こらないボタンが表示されるはずです。
-**ANE用のライブラリの作成 [#pbc67169]+*ANE用のライブラリの作成 [#pbc67169]
作成したボタンを押すとアラート画面が表示されるようにします。 作成したボタンを押すとアラート画面が表示されるようにします。
このままjavaフォルダ以下に処理を書いても良いのですが、そうするとActivityなどのテスト用に作ったものまでjarファイルに含まれてしまいます。 このままjavaフォルダ以下に処理を書いても良いのですが、そうするとActivityなどのテスト用に作ったものまでjarファイルに含まれてしまいます。
-万が一、テスト用のコードが動いてしまうようなことが無いようにここでは別にライブラリを作成します。 +万が一にもテスト用のコードが動いてしまうようなことがないように、ここではAcitivityを含まないライブラリを別に作成します。 
-テスト用のコードがANEに入ったままでも通常は害が無く、ライブラリを作成せずにANEをつくることも可能ですので、面倒な人はそのままjavaフォルダ以下にANEの処理をするクラスを作成しても良いでしょう。ただし、ライブラリの作成は簡単なのでさほど手間が省けるわけではありませんし、整理のためにも別ライブラリにしておいた方が便利です。+テスト用のコードがANEに入ったままでも通常は害がなく、ライブラリを作成せずにANEをつくることも可能ですので、面倒な人はそのままjavaフォルダ以下にANEの処理をするクラスを作成しても良いでしょう。ただし、ライブラリの作成は簡単なのでさほど手間が省けるわけではありませんし、整理のためにも別ライブラリにしておいた方が便利です。
Android StudioでFile->New->New Moduleを選択します。 Android StudioでFile->New->New Moduleを選択します。
Line 73: Line 77:
&ref(newlibrarynavigator.jpg,mw:480,mh:360); &ref(newlibrarynavigator.jpg,mw:480,mh:360);
- +*主処理の追加とAndroidアプリとしてのテスト [#n6d6c2ec]
-**Alert処理の追加 [#n6d6c2ec]+
先ほど追加したライブラリに処理を書いて行きます。まず、anealert/java以下に「njf.jp.anealert.ANEAlert」クラスを加えます。 先ほど追加したライブラリに処理を書いて行きます。まず、anealert/java以下に「njf.jp.anealert.ANEAlert」クラスを加えます。
Line 86: Line 89:
 package njf.jp.anealert;  package njf.jp.anealert;
 + 
 import android.app.Activity;  import android.app.Activity;
 import android.app.AlertDialog;  import android.app.AlertDialog;
 + 
 public class ANEAlert {  public class ANEAlert {
     private Activity activity;      private Activity activity;
Line 104: Line 107:
             alertDialog.show();              alertDialog.show();
         }          }
 + 
     }      }
 + 
 }  }
Line 123: Line 126:
 package njf.jp.anealertsample;  package njf.jp.anealertsample;
 + 
 import android.support.v7.app.AppCompatActivity;  import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;  import android.os.Bundle;
 import android.view.View;  import android.view.View;
 import android.widget.Button;  import android.widget.Button;
 + 
 import njf.jp.anealert.ANEAlert;  import njf.jp.anealert.ANEAlert;
 + 
 public class MainActivity extends AppCompatActivity {  public class MainActivity extends AppCompatActivity {
     private ANEAlert aneAlert;      private ANEAlert aneAlert;
Line 138: Line 141:
         super.onCreate(savedInstanceState);          super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);          setContentView(R.layout.activity_main);
 + 
         aneAlert = new ANEAlert(this);          aneAlert = new ANEAlert(this);
         Button button = (Button) findViewById(R.id.showAlertButton);          Button button = (Button) findViewById(R.id.showAlertButton);
Line 148: Line 151:
                                           aneAlert.showAlert("Android",alertCounter + " times!");                                            aneAlert.showAlert("Android",alertCounter + " times!");
                                       }                                        }
 + 
                                   }                                    }
         );          );
 + 
 +     }
 + }
 +これで実行すると、表示するたびに数字が変わるAlertダイアログが表示されます。
 +&ref(androidss.jpg,mw:480,mh:360);
 +
 +このように、ANEの作成では一度テスト用のActivityを作ってAndroidアプリとして実行してみるのがお勧めです。
 +そうではなく、いきなりANEとして作成してAirで動かそうとするとエラーが起きたときにデバッグがとても大変です。
 +また、その時にはここで紹介したように、ANEの処理はライブラリとして作成しておくと、appの方を好きに書き換えてもANEの方には影響しないので、安全にテストすることが出来ます。
 +
 +Eclipseで開発していた頃は、ライブラリプロジェクトという、ライブラリのみのプロジェクトが作成できたので、それを使ってANEを作成していました。しかし、Android Studioではライブラリのみのプロジェクトは作成できないようなので、このように何かアプリのプロジェクトを作成してそのなかにライブラリをつくるという手順となります。
 +
 +*ANE呼び出し処理の追加 [#a17e7947]
 +
 +いよいよANEの呼び出し部分を作成します。この部分でエラーが起こるとソースを変更するたびにいちいちANE作り替えなければならずデバッグが面倒なので、できるだけシンプルにするように心がけてください。
 +
 +まず、FlashRuntimeExtensions.jarをadobe airのSDKの中の「lib/android」の下から見つけておきます。次にAndroid Studioの左のナビゲーションのタブを「Project」に切り替えlibsの下にさきほどの「FlashRuntimeExtensions.jar」をここにコピー&ペーストします。
 +
 +&ref(スクリーンショット 2016-06-26 0.23.36.png,mw:480,mh:360);
 +
 +この「FlashRuntimeExtensions.jar」をAndroid Studio上で右クリックして、「Add as Library」を選びます。
 +
 +&ref(addaslib.jpg,mw:480,mh:360);
 +
 +どのモジュールに加えるかを訪ねられるので「anealert」に加えます。
 +
 +&ref(createlib.jpg,mw:480,mh:360);
 +
 +うまくいっていればanealertのbuild.gradleのdependenciesに次の1行が加わっているはずです。
 +
 + compile files('libs/FlashRuntimeExtensions.jar')
 +
 +これでANE呼び出しに必要なAPIが使えるようになりました。
 +
 +ここで一度ANEからJavaのソースが呼び出される過程を整理しておきます。
 +
 ++actionscriptでExtensionContext.createExtensionContextメソッドをIDと初期化変数を引数として呼び出す。
 ++Java側ではIDに対応するFREExtensionが初期化される。このとき初期化変数も渡される。
 ++actionscriptでExtensionContextのcallメソッドを関数のIDとともに呼び出す。
 ++Java側ではその関数のIDに対応するFREFunctionクラスのcallメソッドが呼び出される。
 +
 +となります。
 +
 +つまりANE呼び出しには二つのクラスが必要です。一つは初期化を行う「FREExtension」を継承したクラスと、もう一つは実際に処理を定義する「FREFunction」を継承したクラスです。
 +
 +ではまず、FREExtensionを継承したAneHelloWorldFREExtensionクラスは以下のようになります。
 +
 + package njf.jp.anealert;
 + 
 + import com.adobe.fre.FREContext;
 + import com.adobe.fre.FREExtension;
 + import com.adobe.fre.FREFunction;
 + import java.util.HashMap;
 + import java.util.Map;
 + 
 + public class ANEAlertFREExtension implements FREExtension {
 +     @Override
 +     public FREContext createContext(String s) {
 +         FREContext context = new FREContext() {
 +             @Override
 +             public Map<String, FREFunction> getFunctions() {
 +                 Map<String, FREFunction> result = new HashMap<String, FREFunction>();
 +                 result.put("alert", new ANEAlertFREFunction());
 +                 return result;
 +             }
 + 
 +             @Override
 +             public void dispose() {
 + 
 +             }
 +         };
 +         return context;
     }      }
 + 
 +     @Override
 +     public void dispose() { }
 + 
 +     @Override
 +     public void initialize() { }
 }  }
-**ANE呼び出し処理の追加 [#a17e7947+ 
-**jarファイルの取り出し [#veeed4bc]+ここで重要なのはresultというHashMapに"alert"という文字列と、次に定義するANEAlertFREFunctionクラスを設定しているところです。このHashMapをFREContextという、ANEのデータを管理するクラスに設定して返してやることで、"alert"という関数IDによってANEAlertFREFunctionクラスのcallメソッドが呼び出されるようになります。 
 + 
 +では最後に実際に呼び出されるクラス、FREFunctionを継承したANEAlertFREFunctionを定義します。 
 + 
 + package njf.jp.anealert; 
 +  
 + import android.app.Activity; 
 + import android.util.Log; 
 + import com.adobe.fre.FREContext; 
 + import com.adobe.fre.FREFunction; 
 + import com.adobe.fre.FREObject; 
 +  
 + public class ANEAlertFREFunction implements FREFunction { 
 +     private ANEAlert aneAlert; 
 +  
 +     @Override 
 +     public FREObject call(FREContext freContext, FREObject[] freObjects) { 
 +         String title = "TITLE"; 
 +         String message = "MESSAGE"; 
 +         try { 
 +             title = freObjects[0].getAsString(); 
 +         } catch (Exception e) { 
 +             Log.e("njf.jp.anealert", "FunctionAdFunction:cant parse arg 1"); 
 +         } 
 +         try { 
 +             title = freObjects[1].getAsString(); 
 +         } catch (Exception e) { 
 +             Log.e("njf.jp.anealert", "FunctionAdFunction:cant parse arg 2"); 
 +         } 
 +         if(aneAlert == null){ 
 +             aneAlert = new ANEAlert(freContext.getActivity()); 
 +         } 
 +         aneAlert.showAlert(title,message); 
 +         return null; 
 +     } 
 + } 
 + 
 +ここでcallメソッドが実際に呼び出されるメソッド、その引数であるFREContextにはアクテビティの情報など、FREObjectには呼び出しの時の引数が入っています。 
 + 
 +*jarファイルの取り出し [#veeed4bc] 
 +(この記事は「[[How to build ANE in Android Studio:http://www.myflashlabs.com/build-ane-android-studio/]] 」を参考にしています) 
 + 
 +ここまでくるとANEに必要なjarファイルを作成するのは簡単です。 
 + 
 +まず、ツールバーの「Build->Rebuild Project」を選択し、ビルドし直します。そして左のナビゲーションの上の「Project」を選択し(なければ右側のボタンを押す)、「anealert/build/outputs/aar/anealert-release.aar」を探します。 
 + 
 +&ref(aar.jpg,mw:480,mh:360); 
 + 
 +この「anealert-release.aar」が必要なファイルなので、右クリックして「Reveal in Finder」として表示させるなり、「Copy Path」でパスを確かめるなりして、どこか作業用のフォルダにコピーしてください。 
 + 
 +aarファイルは実際にはただのzipファイルなので、この「anealert-release.aar」適当なツールで解凍してください。macなどでは以下のコマンドで行えます。 
 + 
 + unzip anealert-release.aar 
 + 
 +するとその中に「classes.jar」というファイルがあるはずです。それがANE作成に必要なjarファイルです。実際、jarファイルの中を見るコマンド 
 + 
 + jar tf classes.jar 
 + 
 +を実行してみると、 
 + 
 + njf/jp/anealert/ANEAlert.class 
 + njf/jp/anealert/ANEAlertFREExtension.class 
 + njf/jp/anealert/ANEAlertFREFunction.class 
 + ... 
 +などが表示され、先ほど制作したクラスが全て入っているはずです。一方不要な「MainActivity」クラスは含まれていません。 
 + 
 +-[[AndroidでのANEの作成]]に戻る 
 +-[[AndroidでのANEの作成/swcの作成]]に進む
« Prev[4]  Next »[5]