фон
в большинстве случаев получение OOM на андроиде связано с использованием слишком большого количества растровых изображений и/или создания больших растровых изображений.
Недавно я решил попробовать JNI, чтобы избежать использования OOM, сохранив данные непосредственно на стороне JNI.
после беспорядка с JNI на некоторое время, я создал несколько сообщений в SO, просящих о помощи и делившихся своими знаниями, и теперь я решил поделиться с вами еще одним кодом. вот сообщения, если кто-то заинтересован в чтении результатов или содействии:
-
декодирование изображений и управление ими с помощью JNI на Android.
-
JNI - как использовать несколько экземпляров оболочки Jni с разными полями?
на этот раз я добавил возможность сохранять, восстанавливать, обрезать и поворачивать растровые изображения. должно быть легко добавить дополнительные параметры и , я был бы счастлив, если бы другие люди добавили свой собственный код в более полезные функции.
поэтому код, который я собираюсь показать, на самом деле объединяет все, что я создал.
пример кода использования:
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
final int width=bitmap.getWidth(),height=bitmap.getHeight();
// store the bitmap in the JNI "world"
final JniBitmapHolder bitmapHolder=new JniBitmapHolder(bitmap);
// no need for the bitmap on the java "world", since the operations are done on the JNI "world"
bitmap.recycle();
// crop a center square from the bitmap, from (0.25,0.25) to (0.75,0.75) of the bitmap.
bitmapHolder.cropBitmap(width/4,height/4,width*3/4,height*3/4);
//rotate the bitmap:
bitmapHolder.rotateBitmapCcw90();
//get the output java bitmap , and free the one on the JNI "world"
bitmap=bitmapHolder.getBitmapAndFree();
Проект доступен на github
-
Страница проекта доступна на github здесь.
-
не стесняйтесь давать советы и вносить свой вклад.
важные примечания
те же заметки, что показано здесь, плюс:
-
текущие функции, которые написаны здесь (более подробно на странице проекта):
-
магазин
-
восстановления
-
вращение на 90 градусов CCW
-
растениеводство.
-
-
Подход, который я использовал для этого кода, - это как эффективность памяти (используйте только память, которая мне нужна, и освободите ее, когда это не нужно), и эффективность процессора (я пытался использовать оптимизацию кеш-памяти указателей и CPU возможно).
-
для лучшей производительности я сделал действительно несколько проверок, особенно в части JNI. лучше всего было бы управлять валидациями в Java-мире.
-
Есть еще много отсутствующих функций, которые, я думаю, должны быть добавлены, и я надеюсь, что у меня будет время их добавить. если кто-то хочет внести свой вклад, я буду рад добавить их код тоже. вот функции, которые, по моему мнению, могут быть полезны:
-
получить текущую bitmap-информацию
-
масштабные растровые изображения, в том числе выбор того, какой алгоритм использовать (ближайшая соседняя и билинейная интерполяция должна быть достаточной).
-
использовать разные форматы растровых изображений
-
выполните декодирование внутри JNI, чтобы избежать создания java-растрового изображения (и не использовать кучу в мире java) с самого начала, только в конце, когда вы закончили все операции.
-
обнаружение лица
-
вращение под любым углом или, по крайней мере, очевидные. в настоящее время я только добавил поворот на 90 градусов против часовой стрелки.
-