Определение общего объема оперативной памяти с помощью вызовов 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 шт):

Автор решения: woesss

Зачем искать и переписывать 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/

→ Ссылка