CrossRoadスマートフォン用の表示で見るCrossRoadAR、MR、VR、Babylon.jsを中心とした技術ブログ。nativeの関数をUnityから呼び出す方法について紹介してきました。CrossRoadこの方法によりJavaで書いたコードをUnityで呼べるのは間違いありません。2回目で書いたように、実際に呼びたいAndroidの側のコードはもっと複雑であることが多く、この方法だけではうまくいかないことがあります。Studio)をUnityで使おうとすると、色々なエラーがでてしまい、使うことができません。CrossRoadそこで、この記事では、AndroidのnativeコードをUnityで使うとき、私が困ったことと対応方法について整理したいと思います。StudioでUnity系のpackageを書くとエラーになるたとえば、Unityの関数(例:UnitySendMessage)をAndroidから呼び出したり、Unity上のAndroid向けActivityを取得するためには、下記のようなpackageをインポートする必要があります。com.unity3d.player.UnityPlayerNativeActivity;これをソースコードに書くとエラーになります。Studioのプロジェクトにインポートする必要があります。classes.jarはMacとWindowsで置き場所が異なります。下記はUnity5.3.5f1のときの配置です。Unityのバージョンによって場所が変わることがあるようなのでご注意ください。Files\Unity\Editor\Data/PlaybackEngines/AndroidPlayer/Varitations/mono/Release/Classes/classes.jarインポートする場所は下記です。Warningなどが1,2回出ますが、OKを押して進めます。この後、gradleのsyncを実行すればエラーが消えます。"sourceSets"があります。下記のブログを書かれた方の動機から推測すると、このオプションはEclipse上での構成を移行するときに使うようです。Qiita今回、MicrosoftのBingSpeechAPIをmodule化するために、新規プロジェクトを作って試しました。そのとき、元のMSのサンプルコードにあるbuild.gradleを書き写したところ、下記でエラーになりました。Viewからはmanifestフォルダが消えてしまいました。StudioプロジェクトとEclipseから移行したプロジェクトではManifestファイルの配置場所が異なっているためです。Eclipseから移行したプロジェクトでなければ不要です。ViewでmanifestフォルダとAndroidManifest.xmlが復活します。aarとjarは、どちらを使えばよいか?UnityでAndroidのコードを使うには、aarかjarのどちらかをインポートする必要があります。aarとjarの違いはここで解説した通りですが、再掲します。Archiveつまり、aarの方が範囲が広く、aarにはjarだけでなくAndroidManifest.xmlも入っています。自分の実験結果、および購入したアセットのフォルダ構成調査の結果から、Unityではaarもjarのどちらも使えます。(Plugins/Androidに入れるだけです)しかし、aarを使う場合、Androidmanifest.xmlの記述内容によっては、Unityでビルドした時にコンフリクトエラーになる場合があるため、Unityで準備されているAndroidManifest.xmlと重複記述がないようにする必要があります。Unityで準備されているAndroidManifest.xmlは、MacとWindowsで置き場所が異なります。Files\Unity\Editor\Data/PlaybackEngines/AndroidPlayer/Apk/AndroidManifest.xmlUnityで提供されているAndroidManifest.xmlを使うときはコンフリクトに注意します。Studio側に書いてしまうと、Unity側とコンフリクトを起こすので、書かないようにします。いうエラーがでる2016/11/1に追加しましたjarファイルだけを使う場合、このエラーは発生しません。StudioでUnitySendMessageとか、Unity向けのメソッドを使うために入れたclasses.jarが、Unityに入れたaarに残っており、UnityでAndroid向けのビルドをするときに使われるclasses.jarとかぶってしまうのが原因のようです。Studio側のbuild.gradleで下記を書いておきます。Studioでライブラリのパッケージ(aar)を作る時、libs/classes.jarを除きます。activityを呼び出すには?(2016/11/28に追加しました)aarの中にActivityがある場合、Unityから呼び出すことができます。それぞれ、下記のコードを書きます。Java側のAcitivityに画面を準備していない場合、startActivityを呼び出した段階で画面が真っ白になります。Studio側でプラグインを作成し、Unity側でこのようなコードを書いたとします。gist1c06bc192c8f65903dddb081e1f385b3そして、bindService_Start()メソッドをUnityで呼ぶとこのようなエラーが出ることがあります。(指定したクラスは存在しない)というエラーです。Unity側で指定したpackage名は合っています。Studio側のサンプルに含まれていたプラグインや、ヘッダファイル的なもの)をUnity側にインポートしていないことが原因でした。Studio側で呼び出したいクラスにimplementの記載があると、implementで宣言されたメソッドの実体が入っているjarファイルがUnityにないと、package名が合っていてもClassNotFoundExceptionになるようです。Studioで作った機能をUnityで使う場合には発生しないかもしれませんが、今回のように既存のAndroidの機能(そこそこ複雑なもの)をUnityで使えるようにしたい、というときにありえます。AndroidプロジェクトにC/C++ネイティブライブラリを含むとき、Unityではどこに配置するか?(2017/7に追加しました)AndroidはJavaですが、時にはC/C++で書かれたライブラリを使いたい時があります。このような外部ライブラリは一般的にPluginsディレクトリ以下に配置しますが、Android向けのライブラリファイルは配置するディレクトリが決まっています。以下のように配置する必要があります:Assets/Plugins/Android/libs/x86/Assets/Plugins/Android/libs/armeabi-v7a/もしこのルールを守らず、例えば、Assets/Plugins/Android/aaa.soと配置すると、以下のようなエラーが出ます。"aaa.so"Unityではディレクトリ構成が比較的自由ですが、プラグインについては記述を守る必要があります。いうエラーが出る(2017/7に追加しました)たとえば、このようなコードを書いてServiceとしてAndroidの別機能を呼び出すとします。gistd4f26eb7a4434747971dedbf4f5517d9すると、こんなエラーが出ることがあります。android.os.Handler.dispatchMessage(Handler.java:95)原因はAndroidManifest.xmlにあります。私の場合は、Serviceの使い方を参考にしたサンプルコードにisolatedProcessというタグが入っていました。isolatedProcessを抜くと解決します。Unityで現在のAcitivityを取得するには?(2017/7に追加しました)Unity側のC#でこのようなコードを書きます。Unityで作ったAndroidアプリは、Unityの準備したActivityがメインのActivity以前になります。書いたブログでは、currentUnityActivity変数を使って現在のActivityを取得し、これを元にServiceを起動していました。終わりにひとまず、思いつく限りのトラブル対応集を書き出してみました。今回書いた内容は、インターネットで直接の情報が得られず、解決まで時間を要したものが多いです。今回の情報が、UnityでAndroidのネイティブプラグインを使う方の参考になれば幸いです。2018の11日目の投稿です。API(Android用...前回の続きです。»ProfileAR、MR、VR、Babylon.jsを中心とした技術ブログです。広く色々な技術を勉強するのが好きで、あれこれ書いています。詳細なプロフィールはこちらをご確認ください。2020)■プライバシーポリシー■こちらに記載しておりますのでご確認ください。■お問い合わせ■こちらよりお願いいたします。月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。