AndroidJavaObjectで死亡

Unity では C# Script中の AndroidJavaObject を経由して、Javaのオブジェクトの関数とか呼べたりするのは良いのでーすーがー……

// Java
package net.p_pit.rozen

public class Tamagoyaki
{
  pubilc int getAijyoByMicchan() {
    return Integer.MAX_VALUE;
  }
};

public class Kashira
{
  public int getNumber() {
    return 2;
  }
  
  public Tamagoyaki getTamagoyaki()
    return null;
  }
};
// Unity 5.0.1 ぐらい
using UnityEngine;

public class UseJavaClass : MonoBehaviour
{
  void Start()
  {
    using(AndroidJavaObject kana = new AndroidJavaObject("net/p_pit/rozen/Kashira"))
    {
      // OK
      int number = kana.Call<int>("getNumber");
      
      // Exception: JNI: Init'd AndroidJavaClass with null ptr!
      using(AndroidJavaObject tamago = kana.Call<AndroidJavaObject>("getTamagoyaki"))
      {
        if(tamago == null) {
        
        } else {
        
        }
      }
    }
  }
}

Java側の関数をコールした際、戻り値の型がプリミティブ型であれば問題ないんですが、Java object を返す場合 AndroidJavaObject を指定したところで落ちるっていう。

AndroidJavaObjectのコンストラクタを逆アセンブルすると次のような実装になってるようで

internal AndroidObject (IntPtr jobject) : this()
{
  if(jobject == IntPtr.Zero)
  {
    throw new Exception ("JNI: Init'd AndroidJavaClass with null ptr!");
  }


えー(苦笑

個人的には、Java側が null 返したら、Unity側でも null返してほしい所ですけどねぇ…。 結局、Java側でnullを返した際にUnity側で受け取る方法がわからず、必ずインスタンスを返す方向で無理やり実装しました。


Unity側では Java側で nullを返す事がある関数の呼び出しを行ってはいけないって所なんですかねぇ。うむむ…