UnityのAndroidプラグインを作成中に発生したエラーに関するメモ。
UnityのAndroidプラグイン作成時にClassNotFoundExceptionが発生
marunouchi-tech.i-studio.co.jp
上記の記事を参考にUnityのAndroidプラグインを作成しました。
全体の流れとしては、
- Android StudioでUnity向けのAndroidプラグイン(aar)を作成
- Unityでプロジェクトで「Plugins」→「Android」にaarをドラッグ&ドロップ
- ビルドしてAndroid端末で動作確認
実装までは一通りできたのですが、Android端末で動作確認したところ、Androidプラグインで実装した部分のイベントがいつまで経っても呼ばれない状態でした。
Unityで確認してもエラー内容が詳しく表示されなかったので、Android StudioのLogcatでログを確認してみると、下記のような感じでした。
2019-05-07 15:08:29.910 12699-12714/? E/Unity: AndroidJavaException: java.lang.ClassNotFoundException: com.app01.test.Native
java.lang.ClassNotFoundException: net.sanukin.vibration.UniVibration
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:400)
at java.lang.Class.forName(Class.java:326)
at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
at com.unity3d.player.UnityPlayer.c(Unknown Source)
at com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source)
at android.os.MessageQueue.next(MessageQueue.java:392)
at android.os.Looper.loop(Looper.java:139)
at com.unity3d.player.UnityPlayer$e.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.app01.test.Native" on path: DexPathList[[zip file "/data/app/test.test.test01-1/base.apk"],nativeLibraryDirectories=[/data/app/test.test.test01-1/lib/arm, /data/app/test.test.test01-1/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java
ClassNotFoundExceptionが発生しているようです。
Unity側でAndroidプラグインをちゃんと認識してないっぽい感じでした。
上記にあげたサイトを読み返してみたり他のプラグイン作成手順を確認してみましたが、おかしいところはなさげでした。
UnityのAndroidプラグイン作成時にClassNotFoundExceptionが発生した場合の対処法
色々と調べた結果、以下の記事が参考になりました。
こちらによると、UnityのBuild Systemを変更すると解決するっぽいとのことだったので、Gradleを
Internalに変更してみました。
Internalに変更したら、ClassNotFoundExceptionが発生しなくなりました。
でもUnityのAndroidプラグインが動作しない
ClassNotFoundExceptionは発生しなくなりましたが
今度はUnity上のビルドで下記のエラーが発生するようになりました。
IOException: Failed to Copy File / Directory from 'Temp/StagingArea/android-libraries/unityplugin-debug/classes.jar'
エラー内容をみる限り、内容Unity向けのAndroidプラグイン(aar)作成時に導入した「classes.jar」関連のエラーっぽいので、Gradleの設定を変更してみました。
変更前
android.libraryVariants.all { variant ->
variant.outputs.each { output ->
output.packageLibrary.exclude('libs/classes.jar')
}
dependencies {
compileOnly fileTree(dir: "libs", include: '*.jar')implementation 'com.android.support:appcompat-v7:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
変更後
dependencies {
compileOnly fileTree(dir: "libs", include: '*.jar')implementation 'com.android.support:appcompat-v7:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}android.libraryVariants.all { variant ->
variant.outputs.each { output ->
output.packageLibrary.exclude('libs/classes.jar')
}
Androidプラグインが動いた!
この変更を加えてAndroidプラグインを再ビルドした結果、正常動作するようになりました。
もしかしたらUnity側のロードエラーやキャッシュ関連が原因の可能性もありますが、挙動をみる限り、gradleの指定順で「classes.jar」の除外がうまく適用されなかったのかもです。
一応動いたけど...
一応動作したのですが、上の方で変更したUnityの「Build System」の設定「Internal」が「deprecated」(廃止予定)なのが気になります...
時間がある時に Build Systemの設定の意味を調べようと思います...
今回はとりあえずOKということにしておきます。