Как использовать растровые операции JNI, чтобы избежать OOM при использовании больших изображений? [закрыто]
В большинстве случаев получение OOM на Android происходит из-за использования слишком большого количества растровых изображений и / или создания больших растровых изображений.
Недавно я решил опробовать JNI, чтобы избежать OOM, сохраняя данные на стороне JNI.
После того, как я некоторое время возился с JNI, я создал несколько постов на SO с просьбой о помощи и поделился своими знаниями, и теперь я решил поделиться с вами еще большим количеством кода. Вот сообщения на тот случай, если кто-то захочет прочитать полученные данные или внести свой вклад:
Как кешировать растровые изображения в родную память
декодирование и манипулирование изображениями с использованием JNI на Android
JNI - как использовать несколько экземпляров оболочки Jni с разными полями?
Вращение растрового изображения с использованием JNI & NDK
На этот раз я добавил возможность хранить, восстанавливать, обрезать и вращать растровые изображения. должно быть легко добавить больше опций иЯ был бы рад, если бы другие люди добавили свой код к более полезным функциям. .
поэтому код, который я собираюсь показать, на самом деле объединяет все, что я создал.
Пример кода использования: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 градусов против часовой стрелки
растениеводство.
подход, который я выбрал для этого кода, заключается в эффективности использования памяти (используйте только ту память, которая мне нужна, и освобождайте ее, когда она не нужна), и эффективности ЦП (я старался по возможности использовать указатели и оптимизации кэша памяти ЦП).
для лучшей производительности я сделал очень мало проверок, особенно в части JNI. может быть лучше управлять валидацией в "мире" Java.
еще многоотсутствует функции, которые я думаю, должны быть добавлены, и я надеюсь, что у меня будет время, чтобы добавить их. если кто-то захочет внести свой вклад, я буду рад добавить и их код. Вот функции, которые я считаю полезными:
получить текущую растровую информацию
масштабирование растровых изображений, включая выбор используемого алгоритма (должно быть достаточно ближайшего соседа и билинейной интерполяции).
использовать разные растровые форматы
выполнить декодирование в JNI, чтобы избежать создания растрового изображения Java (и не использовать кучу в мире Java) с самого начала, только в конце, когда вы закончили со всеми операциями.
распознавание лиц
поворот на любой угол или хотя бы очевидные. в настоящее время я добавил только поворот на 90 градусов против часовой стрелки.