2012-04-06 4 views
3

У меня есть блок кода, который в Android NDK выделяет огромные количества памяти. Последнее, что мне нужно, это использовать блок try-catch для возможности, возможно, NoMemoryError. Вы знаете, как записать его в собственный SDK?Android NDK - попробуйте поймать NoMemoryError

Мне нужно реализовать такую ​​же функциональность, как это:

 for(int i=1;i<50;i++){ 
     try{ 
      int[] mega =new int[i*1024*1024];//1MB 

     }catch (OutOfMemoryError e) { 
      usedMemory= (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/new Float(1048576.0); 
      usedText=usedMemory+" MB"; 
      tw.setText(usedText);   
      break; 
     } 
    } 
+0

Ваш комментарий говорит о 1 МБ, но на самом деле он будет выделять 4 МБ на каждую итерацию. Проблема с этим кодом заключается в том, что Android выйдет из строя и сгорит, прежде чем вы получите исключение. Система будет пытаться отключить другие приложения и службы, чтобы освободить память, и в процессе Android будет очень медленным и в конечном итоге начнет ошибочно работать. Вместо того, чтобы подчеркивать такую ​​систему, почему бы вам просто не запросить количество свободной памяти? – BitBank

+0

Мне просто нужно это для практики NDK ... и я думаю, что нет способа воспроизвести эту функцию в NDK, что вы думаете? Кстати, это не важно, будь то 1 МБ или 4 МБ, я проверяю свободную память от времени выполнения – Waypoint

ответ

4

В функции JNI вы можете бросить исключение Java с помощью последующего фрагмента. При компиляции собственного кода убедитесь, что RTTI и исключения включены.

try { 
    int *mega = new int[1024 * 1024]; 
} catch (std:: bad_alloc &e) { 
    jclass clazz = jenv->FindClass("java/lang/OutOfMemoryError"); 
    jenv->ThrowNew(clazz, e.what()); 
} 

В Java вы можете просто поймать OutOfMemoryError.

try { 
    // Make JNI call 
} catch (OutOfMemoryError e) { 
    //handle error 
} 
1

Android является not very friendly to C++ exceptions (вы должны связать со специальной версией библиотеки C++, представленной Android, чтобы иметь исключения). Может быть, вы должны использовать malloc() и проверить его возвращаемое значение, чтобы узнать, было ли распределение памяти в порядке?

1

Если вы инициируете исключение/ошибку в своем собственном коде, вы должны быть в состоянии catchit. Тем не менее, я бы предположил, что выделение большого фрагмента неуправляемой памяти с использованием malloc или подобного не вызовет ошибки, но убьет вас приложить трудный путь. Однако, если вы создаете тот же большой массив java, что и в вашем java-коде, метод java, который вы вызываете для создания массива, завершится с ошибкой и создаст исключение. Как обработка исключений в JNI очень разные, вы должны проверить исключения в вашем родном коде вручную, используя что-то вроде:

exc = (*env)->ExceptionOccurred(env); 
if (exc) ... 
Смежные вопросы