4: 2016-06-25 (土) 17:23:00 njf |
現: 2018-01-04 (木) 22:28:37 njf |
| + | [[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); |
| | | |
| *テスト用ボタンの設置 [#gf75d92b] | | *テスト用ボタンの設置 [#gf75d92b] |
- | ANEの作成はけっこう面倒なので、Android上で出来るテストは出来るだけ行ってから、ANEの作成にうつった方が効率的です。そのためのテスト用ボタンを設置します。 | + | ANEの作成はけっこう面倒です。それを何度もやらなくてすむように、Android上でテストはできるだけ行ってから、ANEの作成にうつった方が効率的です。そのためのテスト用ボタンを設置します。 |
| | | |
| まず、左側のナビゲーションから「aap/res/layout/activity_main.xml」を選択します。 | | まず、左側のナビゲーションから「aap/res/layout/activity_main.xml」を選択します。 |
| 作成したボタンを押すとアラート画面が表示されるようにします。 | | 作成したボタンを押すとアラート画面が表示されるようにします。 |
| このまま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を選択します。 |
| | | |
| &ref(newlibrarynavigator.jpg,mw:480,mh:360); | | &ref(newlibrarynavigator.jpg,mw:480,mh:360); |
- | | |
| | | |
| *主処理の追加とAndroidアプリとしてのテスト [#n6d6c2ec] | | *主処理の追加とAndroidアプリとしてのテスト [#n6d6c2ec] |
| | | |
| 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; |
| alertDialog.show(); | | alertDialog.show(); |
| } | | } |
| + | |
| } | | } |
| + | |
| } | | } |
| | | |
| | | |
| 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; |
| 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); |
| aneAlert.showAlert("Android",alertCounter + " times!"); | | aneAlert.showAlert("Android",alertCounter + " times!"); |
| } | | } |
| + | |
| } | | } |
| ); | | ); |
| + | |
| } | | } |
| } | | } |
| | | |
| いよいよANEの呼び出し部分を作成します。この部分でエラーが起こるとソースを変更するたびにいちいちANE作り替えなければならずデバッグが面倒なので、できるだけシンプルにするように心がけてください。 | | いよいよANEの呼び出し部分を作成します。この部分でエラーが起こるとソースを変更するたびにいちいちANE作り替えなければならずデバッグが面倒なので、できるだけシンプルにするように心がけてください。 |
- | (この記事は「[[How to build ANE in Android Studio:http://www.myflashlabs.com/build-ane-android-studio/]] 」を参考にしています) | |
| | | |
| まず、FlashRuntimeExtensions.jarをadobe airのSDKの中の「lib/android」の下から見つけておきます。次にAndroid Studioの左のナビゲーションのタブを「Project」に切り替えlibsの下にさきほどの「FlashRuntimeExtensions.jar」をここにコピー&ペーストします。 | | まず、FlashRuntimeExtensions.jarをadobe airのSDKの中の「lib/android」の下から見つけておきます。次にAndroid Studioの左のナビゲーションのタブを「Project」に切り替えlibsの下にさきほどの「FlashRuntimeExtensions.jar」をここにコピー&ペーストします。 |
| | | |
| うまくいっていればanealertのbuild.gradleのdependenciesに次の1行が加わっているはずです。 | | うまくいっていればanealertのbuild.gradleのdependenciesに次の1行が加わっているはずです。 |
- | compile files('lib/FlashRuntimeExtensions.jar') | |
| | | |
| + | compile files('libs/FlashRuntimeExtensions.jar') |
| | | |
| これでANE呼び出しに必要なAPIが使えるようになりました。 | | これで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() { } |
| + | } |
| + | |
| + | |
| + | ここで重要なのは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] | | *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の作成]]に進む |