[AS3] AIRのAndroid用ANEを作る際の注意事項

2014/04/16

すごい個人的なメモです。整理してないので意味わかんないかも。すみません。
でも困ってる人には有効な情報かもしれないので、公開します。
前にAIRのAndroid用のANEを作った際に試行錯誤してつくりました。

iOS版の関連エントリもどうぞ

普通のANEならわりとできるのだけど、外部のjarを埋め込んだり、Rを使うのをどうやるのかわからず。
検索するも、確かな情報が少なくビルドするだけで2日かかったなんてとても言えません、、。うわー。

これ使ってDropboxのSyncAPIをAndroidのネイティブUIを表示して操作+ASと連携するANEを作りました。
(仕事で作ったので公開できませんです、、)

(いろいろあって、ANE部分でネイティブUIを使ったのだけど、iOSもあわせると Android+iOS+AIRの3重開発!になるので、ネイティブUI使うのはあまりおすすめできないかも、、。でもAIRの上に表示させたり連携させるのは可能です。)

Androidのネイティブプロジェクト(Eclipse = Android Developer Toolsでの作業)

Project > Properties > 左側のAndroid > 画面の is Library のチェックをONにして
Androidライブラリプロジェクトにする

その際にライブラリのパッケージ名はaneのパッケージ名と同じにする必要がある
(Rを利用するため)

AndroidManifest.xmlの上の方の

<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”ここにANEのパッケージ名をきちんとつける必要がある”
android:versionCode=”1″
android:versionName=”1.0″ >


例)
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.myane.packagename”
android:versionCode=”1″
android:versionName=”1.0″ >

うまくいくとRを利用するときの各classでのimport文が以下のようになる
import com.myane.packagename.R;

書き出してjarにするときは、ファイルエクスプローラーのプロジェクトを選択。
右クリックしてExport
ダイアログが出るので、いったん全部のチェックをはずす。そのあとsrcのみチェックをいれて書き出す。
それ以外のmanifestとかresとかlibsとかはここで書き出しても意味ないです。(manifestはいらないし)

resとlibsはビルドのandroid用フォルダにそのままコピーします。あと必要な外部jarもそのandroid用フォルダにコピーします。

Rについて

AIR4.0からRが利用しやすくなっている
利用するためには、android用のplatform.xmlをビルド時につける必要がある。
(ビルド時のadtコマンドの引数にextension.xmlにも加えて追加指定する)

platform.xml内で、packagedResourceに自分のaneのパッケージ名をつけて
リソースのresフォルダを指定しておく。
ビルド時にはandroid用のフォルダに、Javaのプロジェクトからresフォルダをコピーしておく。

android用のplatform.xmlの例

<platform xmlns="http://ns.adobe.com/air/extension/4.0">
	<packagedDependencies>
	    <packagedDependency>android-support-v4.jar</packagedDependency> 
	    <packagedDependency>dropbox-sync-sdk-android.jar</packagedDependency>
	</packagedDependencies>
	<packagedResources> 
		<packagedResource> 
		    <packageName>com.kumade.ane.dropboxaneandroid</packageName> 
		    <folderName>res</folderName> 
		</packagedResource>
	</packagedResources>
</platform>

参考URL
http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-2e74ffb4130044f3619-7ff8.html#WSA61FD03D-6F46-4ff9-A77A-9D47C47501F3

soフォルダはビルドするAndroid用フォルダの中のlibsフォルダの中にarmeabi-v7aフォルダをつくってその中にいれておく
http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-2482335412ffea65006-8000.html
その他フォルダもいらないかもしれないがlibsフォルダにいれておいた

各Rのリソースidは一意になるように、アプリ名_xxx とか名前が長くなってもやっとく方がよし。

あと、他言語対応も、Rのstringsでできた。

ビルド

resフォルダはビルド時にシェルスクリプト(build.sh <- 自作したものなので、気にしないでください)でコピーされているか確認 adtコマンドの例

各行末の\(バックスラッシュ)は改行したいのでつけています。これを削除して1行の長いコマンドにしても動きます。${変数名}はシェルスクリプト内の別のところで定義されてます。

adt -package \
-target ane ${ANEName} extension.xml \
-swc ${ASLibSwcName} \
-platform Android-ARM \
  -platformoptions android_options.xml \
  -C android . \
-platform iPhone-ARM \
  -platformoptions ios_options.xml \
  iosLib/Dropbox.framework \
  -C ${iOSDir} . \
-platform default \
  -C default . 

Flash Builderでテストする際

プロジェクト設定で、ANEのチェックをはずす -> OKボタン(設定ダイアログ閉じる)
もう一度プロジェクト設定を開いて、ANEのチェックをつけなおす(なぜかそうしないとキャッシュが残ることがある)

R内のidについて

ResのR.layout.なんとかはidがネイティブと一致しているか確認した方がよい

//JavaでのANEの関数
FREContext arg0
int layoutId = arg0.getResourceId(“layout.activity_main”);

//Androidネイティブ
R.layout.activity_main

が一致すればOK

Andoridネイティブはこういうのもある
getResources().getIdentifier(“sample_action_menu”, “id”, getPackageName());

これはswitch文でR.layout.activity_mainを使うとcaseでコンパイルエラーになってしまったので、そのときの対策用。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る