Unity 2017.1でビルドしたAndroidアプリが「java.lang.NoSuchMethodError: com.unity3d.player.UnityPlayer.<init>」で落ちてしまう場合の対応

ヨメレバCSS
オリジナルCSS


※本サイトはアフィリエイトプログラムによる収益を得ています。
 ページ内のリンクがアフィリエイトリンクの場合があります。

 とりあえずメモ。

 環境はUnity 2017.1.0f3です。

スポンサーリンク
GoogleAdSence レクタングル(大)

Unity 2017.1でビルドしたAndroidアプリが落ちる

 Unity2017がリリースされたので簡単に試してみたところ、ビルドしたAndroidアプリを実行すると「Caused by: java.lang.NoSuchMethodError: com.unity3d.player.UnityPlayer.<init>」エラーで落ちてしまいました。

 コンストラクタの呼び出しっぽいことはわかるのですが、Unity 5.6では正常に動作しているのでよくわからない。

 アプリではGREEが作っているWebViewプラグインを使っていて、どうもそれが引っかかっているようでした。

Unity 2017でUnityPlayerの引数が変わったみたい

 調べていくと、どうもcom.unity3d.player.UnityPlayerのコンストラクタ引数が変更されているようでした。

 Unity 5.6では

public UnityPlayer(ContextWrapper contextwrapper)

ですが、Unity 2017.1では

public UnityPlayer(Context context)

となっているようです。

 そのため、Unity 5.6のEditor/Data/PlaybackEngines/AndroidPlayer/Variations/mono( または il2cpp)/Development( または Release)/Classes/classes.jar をリンクしてビルドしているプラグインにおいて、UnityPlayerを継承しているクラスのコンストラクタで、

    public ExtendUnityPlayer(ContextWrapper contextwrapper)
    {
        super(contextwrapper);
    }

みたいなコードを書いていた場合に落ちていたようです。

 jarのclassは中間言語になっていますから、実行時に落ちてしまう流れですね。

簡易な対応はUnity 2017.1のclasses.jarでビルドする

 この問題、Unity 2017.1だけを対象にするなら、2017.1のclasses.jarをリンクしてプラグインをコンパイルしてやればいい話です。

 そこでこの部分がエラーになってくるでしょうから、

    public ExtendUnityPlayer(Context context)
    {
        super(context);
    }

などとしてやれば良いでしょう。

 ただ問題は、5.6との互換性を維持させようとしたときにどうすればいいのか…

 Unity側で互換性のあるコンストラクタを用意してくれればそれが一番ラクなんですが、そうでなければ5.6向けと2017.1向けのjarを生成して、ビルド前に入れ替えるとかですかね…今のところ良いアイデアがありません…

スポンサーリンク
GoogleAdSence レクタングル(大)

シェアする

スポンサーリンク
GoogleAdSence レクタングル(大)