Определение общего объема оперативной памяти с помощью вызовов Java классов из C# (Unity)
Появилась необходимость узнать общий объем оперативной памяти устройства, которое будет запускать скомпилированную версию приложения, т.к все приложение на Unity, решил вызывать Java код из C# путем использования классов AndroidJavaClass и AndroidJavaObject. Сам принцип работы этих классов понятен, т.к уже писалась система с их использованием. Непонятно одно, принцип получения информации об объеме памяти. Нашел пример кода на Java, в теме: Как программно получить свободный объём оперативной памяти в android?
Ниже пример кода из темы:
MemoryInfo memoryInfo = new MemoryInfo();
ActivityManager activityManager = (ActivityManager)getActivity(). getSystemService(Context.ACTIVITY_SERVICE);
activityManager.getMemoryInfo(memoryInfo);
Log.i("Memory", "Free RAM="+memoryInfo.availMem);
Log.i("Memory", "Total RAM="+memoryInfo.totalMem);
Однако не могу получить доступ к полю totalMem.
Вот пример моего кода:
javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
javaObject = javaClass.GetStatic<AndroidJavaObject>("currentActivity");
androidActivityManagerMemoryInfo = new AndroidJavaClass("android.app.ActivityManager$MemoryInfo");
totalMem = androidActivityManagerMemoryInfo.Get<long>("totalMem");
Т.е я получаю текущее activity приложения, нахожу android класс ActivityManager.MemoryInfo и пытаюсь от него получить поле totalMem, в соответствии с документацией о классе и назначении поля https://developer.android.com/reference/android/app/ActivityManager.MemoryInfo, но в зависимости от различных правок в коде получаю либо отсутствие ссылки на объект, либо 0 (опять же почему 0 - неизвестно).
Ответы (1 шт):
Зачем искать и переписывать java код, если можно найти готовый для юнитов:
const uint kMegabyte = 1048576u;
AndroidJavaObject getMemoryInfo()
{
AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject systemService = currentActivity.Call<AndroidJavaObject>("getSystemService", "activity");
AndroidJavaObject memoryInfo = new AndroidJavaObject("android.app.ActivityManager$MemoryInfo");
systemService.Call("getMemoryInfo", memoryInfo);
return memoryInfo;
}
int getAvailMemory()
{
using (var memInfo = getMemoryInfo())
{
return (int)(memInfo.Get<long>("availMem") / kMegabyte);
}
}
int getTotalMemory()
{
using (var memInfo = getMemoryInfo())
{
return (int)(memInfo.Get<long>("totalMem") / kMegabyte);
}
}
Источник: https://forum.unity.com/threads/systeminfo-systemmemorysize-return-weird-value-on-samsung-s9.527096/