前回紹介した、Microsoftのcognitive Serviceの一つ、Bing Speech to Text APIをUnityで使おうと思い、サンプルのAndroidプロジェクトのプラグイン化を試しています。
【2016/11/27更新】【Android】Bing Speech APIを使う手順とトラブル対応法をまとめました - CrossRoad
まだできていませんが、その過程でAndroid StudioとUnityの連携について色々とわかってきました。ただ、普段Unityでアプリ開発をしていてAndroid Studioに詳しくない人(私のことです、、)にはわかりづらいところもあったので、Android Studioの基礎知識も含めて解説したいと思います。
なお、下記の環境で検証しています。
- Mac OSX : 10.11.6
- Android Studio : 2.1.3
1. Android Studioの基礎知識
Googleが2013年頃から提供している、Andoridアプリケーションの開発環境です。従来のEclipse+Android向けプラグインでの開発方法とは、色々なところで手順が異なっています。参考までに、異なる例をいくつか解説します。1-1. プロジェクト構成の表示方法
Eclipseのときは、ディレクトリ構成がそのまま表示されていましたが、Android Studioでは色々な表示が選べるようになっています。表示を変更するには、左上の垢枠部分を選択して一覧を表示します。今時点で私がよく使っているのは、Project ViewとAndroid Viewです。
Project Viewは、従来のEclipseと同様にディレクトリ構造がそのまま表示されています。たとえば、表示順番はずれてますが、下記のように、MacのFinderとProject Viewの内容は一致しています。
一方、Andorid Viewは、実装に必要なファイルが前面に表示され、かなりすっきりしています。 実は最初、 Viewが複数あることに気づかず戸惑いました。
たとえば、「「ここ」にあるmanifestファイルを修正して〜」という解説記事を見たとき、その記事では Android Viewのスクショで説明されているのですが、自分の環境はProject Viewになっていたので、「manifestフォルダはどこ?」になってしまいました。
1-2. ビルドシステム
Eclipseのときと異なり、Gradleという仕組みが導入されました。下記に紹介する記事で勉強させていただきました。ありがとうございます。Gradleとは何か?、については下記の解説が大変わかりやすいです。
https://www.ntts.co.jp/column/tec/java_03/index2.html
記事の「Gradleのインストールと設定」以降は、Android Studio使用時には条件が異なりますので、それ以前をご参照ください。また、下記にはAndroid StudioでGradleを使うときの便利な点が書かれており、参考になります。
ここが凄いよ AndroidStudioとGradle - Firespeed
Android Studioでプロジェクトを作るといくつかのgradleファイルができるのですが、よく使うのはbuild.gradleです。build.gradleの使い方は2-2で解説します。
1-3. ApplicationとModule
Android Studioでは、build.gradleの記述を少し変えるだけで、ビルドする対象をApplication(apk)かModule(aar)に分けることができます。apkは従来通りAndroidアプリそのものです。aarとは、Android Archive Libraryの略で、Androidプロジェクトのビルド結果(classes.jar)、およびAndroidアプリに必要なプロジェクト情報をまとめたものです。aarファイルはzip圧縮されているので、例えば下記のコマンドで簡単に中身を見ることができます。
$ mkdir testfolder $ mv test.aar test.zip $ mv test.zip testfolder $ cd test $ unzip test.aar
詳細な構成はAndroid Studioでのアプリの作り方に依存しますが、例えばこのようになります。
この中にあるclasses.jarが、Android Studioで書いたソースコードをコンパイルしたものです。その他にも色々ありますが、細かくなるため割愛します。
2. moduleを作る手順
いくつかの記事を参考にさせていただきました。ありがとうございます。AndroidStudioを使ってUnityとAndroidの連携 - ほげほげ(仮)
UnityとAndroidネイティブの連携:UnityからネイティブのActivityを呼び出す[part1] | 未知の路
Unity – Androidでバッテリ情報取得 | MIZUTANI KIRIN
2-1. Module用のプロジェクト作成
実際、Moduleを作るためだけの方法はなさそうなので、まずはAndroid Studioでプロジェクトを作成します。Android Studioを開いて、File -> Newを選択して、新規プロジェクトを作り、ファイル名、Package 名を決めます。次に、Activityを選択します。どちらでもよいですが、今回はEmpty Activityを選択します。
次に、出来上がった空っぽのプロジェクトを開いた状態で、New Moduleを選択します。
Android Libraryを選択して、Nextをクリックします。今回のモジュール名を決めます。ここではnativepluginとしました。
すると、このように、nativepluginという名前のフォルダが新しく生成されます。
2-2. build.gradleの編集
ここまで作ると、build.gradleが三種類できています。見やすい様にAndroid Viewで示します。しかし、今回のmodule作成用には、"Module:nativeplugin"と書かれたファイルだけを使います。build.gradleは、ビルドに関する設定をまとめたファイルで、"{}"の単位で設定をまとめます。
Unity向けのmoduleを作るには、まずUnityのライブラリを追加します。Unityのライブラリは、インストールしたPC内にあります。例えば、MacでUnity5.3.5f11の時点の場合、下記にあります。
/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar
このファイルをAndroid Studioにコピーするため、右クリックでcopyを選択します。Project Viewに変更し、app/libs で右クリックしてPasteします。
このとき、classes.jarをドラッグすると、copyではなくmoveになり、元の場所からファイルが消えてしまうので注意してください。
次に、build.gradleのdependenciesに以下を追加します。
dependencies { compile files('libs/classes.jar') }
続けて、gradleファイルとAndroidのプロジェクトファイルをsyncします。これで、AndroidでもUnityが準備しているpackageをimportすることが可能になります。もしエラーがでる場合、"{"が閉じてない、libs/classes.jarを囲むとき、" ' "を使っているか、などを確認してみてください。
また、build.gradleの最後に以下を追加します。
android.libraryVariants.all { variant -> variant.outputs.each { output -> output.packageLibrary.exclude('libs/classes.jar') } }
また、以下はコメントアウトしておきます。
testCompile 'junit:junit:4.12'
まとめると、build.gradleはこのようになります。
gist4d8aba4519264552b097807fb041a2cf
2-3. UnitTest系のコードをコメントアウトする
この時点でgradleをビルドすると、以下の様にエラーがでます。今回、UnitTestは使わないので、対象のソースコードをこのようにコメントアウトしておきます。
gist13288dec60bb1b63c693dbc6197e6d61
2-4. ソースコードの追加
もう一度sync gradleを実行します。次に、下記の場所で右クリックし、javaのクラスファイルを生成します。(注)ここではAndroid Viewで説明しましたが、Project Viewで追加もできます。
下記の様なコードを書きます。
gist084d8d4a6cb21d80ee96273130d3a6ca
(Log.eにしたのは、LogCatで目立たせるためです)
この二つのメソッドがUnityから呼ばれることになります。UnitySendMessageは、Androidで処理した結果をUnityにコールバックするためのメソッドです。これについては次回のブログで解説します。この時点で、一度gradleのビルドを実施します。
2-5. aarの生成
下記の赤枠部分をクリックして、Terminalを表示させます。以下のコマンドを入力してEnterを押します
./gradlew :nativeplugin:clean :nativeplugin:assembleRelease
aarの生成が始まります。完了すると、このように表示されます。
この時点で、aarが生成されています。場所は下記です。
Android Studioのプロジェクトトップ /module名 / build / outputs / aar /
今回の場合、Unityで使うのはjarのみでよいので、jarをUnityにインポートします。
(Android側のプロジェクト構成次第では、jar以外もインポートします)
aarを解凍してjarを取得しても良いのですが、
Android Studioのプロジェクトトップ /module名 / build / indermediates / bundles / classes.jar
に目的のjarがあるので、手間を省くため、こっちを使います。Unityの持つclasses.jarとかぶる懸念があるので、classes.jarをplugin.jarのようにリネームします。(不要な操作かもしれません)
Unityはこのjarを読み込んで、Android Nativeの機能を使います。読み込むとき、jarのファイル名は関係ないようです。このjarファイルをUnityで作ったプロジェクトの、Plugins/Android/ にドラッグすれば、あとはUnity側の処理だけです。
3.終わりに
今回のプロジェクト一式はこちらです。GitHub - flushpot1125/UnityAndroidPluginTest
次回は、このmodule(jar)を使って、UnityからAndroid nativeのメソッドを呼ぶ方法を紹介します。