1. 程式人生 > >Unity3D 呼叫Android原生方法2

Unity3D 呼叫Android原生方法2

記一次Unity通過Android系統函式獲取記憶體資訊的過程,感謝河馬爸爸指導。

Unity原生方法沒有獲取當前可用記憶體的方法,系統記憶體資訊android底層肯定有方法獲取,於是我搜到了這篇文章(http://blog.csdn.net/sxwyf248/article/details/5981251) 提取文章中我主要想要的內容,自己新建了Android工程(為了獲取程式碼中類所在的庫和列舉值或常量值)如下:
//獲取android當前可用記憶體大小 
private String getAvailMemory() 
{
  android.app.ActivityManager am = (android.app.ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
  android.app.ActivityManager.MemoryInfo mi = new android.app.ActivityManager.MemoryInfo();
  am.getMemoryInfo(mi);
  //mi.availMem; 當前系統的可用記憶體 


  return Formatter.formatFileSize(getBaseContext(), mi.availMem);// 將獲取的記憶體大小規格化 
}

Context.ACTIVITY_SERVICE
轉到定義獲得到常量值為:
// Field descriptor #37 Ljava/lang/String;
public static final java.lang.String ACTIVITY_SERVICE = "activity";
至此,通過Android原生方法獲取記憶體資訊的所有資料我們已經掌握了。 Unity內新建一個C#類,翻譯上面的方法,如下:
//獲取剩餘記憶體
    long getAvailMemory()
    {
        AndroidJavaObject am = Current().Call<AndroidJavaObject>("getSystemService", "activity");
        AndroidJavaObject mi = new AndroidJavaObject("android.app.ActivityManager$MemoryInfo");
        am.Call("getMemoryInfo", mi);

        return mi.Get<long>("availMem");// 將獲取的記憶體大小規格化 
    }
知識點1:AndroidJavaObject可以當成任何java類使用,不用考慮引用。 知識點2:類中類用$,如例("android.app.ActivityManager$MemoryInfo",在java中對應的是android.app.ActivityManager.MemoryInfo。MemoryInfo是ActivityManager類檔案中的類中類) 知識點3:屬性直接用Get<T>(“屬性名”);獲取。 送佛送到西~ 額外功能:
String size2string(long size)
    {
        //DecimalFormat df = new DecimalFormat("0.00");
        String mysize = "";
        if (size > 1024 * 1024)
        {
            mysize = string.Format("{0:###.##}", size / 1024f / 1024f) + "M";
        }
        else if (size > 1024)
        {
            mysize = string.Format("{0:###.##}", size / 1024f) + "K";
        }
        else
        {
            mysize = size + "B";
        }
        return mysize;
    }