Как использовать растровые операции 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 градусов против часовой стрелки.

Ответы на вопрос(1)

Ваш ответ на вопрос