Как я могу использовать код BitmapRegionDecoder в android 2.2.2 (Froyo)?

Я читал ответ на другой вопрос о SO, в котором @RomainGuy прокомментировал, что можно (пожалуйста, поправьте меня, если я неверно перефразирую), код back-port из более поздних версий Android для более ранних версий. В частности, меня интересует обратный код для BitmapRegionDecoder от Android версии 2.3.3 (Gingerbread) до версии 2.2.2 (Froyo).

Я бы скорее задал вопрос в более общем плане, как наилучшая практика / чего следует избегать при обратном переносе кода с более поздних версий Android на более старые версии, но stackoverflow намекнул, что мой вопрос может быть закрыт как слишком субъективный.

Может быть, если у вас будет достаточно интереса к теме, этот вопрос может быть «превращен» в более общий … возможно, сообщество wiki?

В любом случае, я был бы признателен за любое понимание того, как это делается. Какой-либо конкретный для моего использования или более общий совет. Выполняют ли вызовы собственные методы из класса java (обязательно с участием NDK)?

Если это действительно возможно (и разумно) для кода вишневого и обратного портов таким образом, я думаю, многим было бы очень полезно знать, как это сделать.

Solutions Collecting From Web of "Как я могу использовать код BitmapRegionDecoder в android 2.2.2 (Froyo)?"

Как отметил BitmapRegionDecoder основан на внешней библиотеке skia . Но это может быть выгодным.

Рассмотрим исходный источник:

  • BitmapRegionDecoder.java . В основном определяет оболочки вокруг собственных методов:

     private static native Bitmap nativeDecodeRegion(int lbm, int start_x, int start_y, int width, int height, BitmapFactory.Options options); private static native int nativeGetWidth(int lbm); private static native int nativeGetHeight(int lbm); private static native void nativeClean(int lbm); // ...multiply nativeNewInstance overloads follow 

    Класс не использует никаких новых API-интерфейсов Java, которые нам нужны для резервного копирования.

  • BitmapRegionDecoder.cpp . Заголовочные файлы включают в себя те, которые присутствуют в Froyo за исключением следующих двух:

    • AutoDecodeCancel.h . Единственная строка, в которой она используется:

       AutoDecoderCancel adc(options, decoder); 

      Этот класс обрабатывает жизненный цикл экземпляров SkDecoder . Это небольшой фрагмент кода и может быть хорошо перенесен.

    • SkBitmapRegionDecoder.h

      Как указано в имени файла, это основной компонент. На самом деле все предыдущие были своего рода обертки вокруг него. Хорошей новостью является то, что нам может не потребоваться обратный Gingerbeard как можно было бы взять всю библиотеку skia из Gingerbeard и скомпилировать ее под Froyo поскольку она является внешней и не содержит никаких новых зависимостей.

PS Я на самом деле не погружался глубоко в код, поэтому, пожалуйста, поправьте меня, если что-то я упустил.

Обновить:

Исходный код, который нам нужен, расположен в следующих репозиториях на филиалах froyo-release и gingerbread-mr4-release :

  • Внешний репозиторий библиотеки skia
    • Файлы заголовков находятся в include/core и include/images
  • База данных Android
    • Java-код: graphics/java/android/graphics/BitmapRegionDecoder.java
    • Исходный код: core/jni/android/graphics/...

Вы можете выполнить резервное копирование некоторого кода, если он может существовать поверх SDK, к которому вы его портируете.

Вы ничего не можете вернуть. Например, вы не можете выполнить резервное копирование функции ядра. 🙂

В этом случае нет простого решения для его обратной передачи. Реализация этого находится поверх Skia и jpeg-декодера, которые являются как собственным кодом. Вам нужно будет выполнить свою собственную реализацию этого кода. Вы можете попробовать скопировать / вставить код с платформы, наклеив его кодом с JNI, но это будет значительная работа и оставит вам собственный код, который вам нужно продолжать поддерживать.

Извините, для этого нет легкого решения.

Вы должны рассмотреть BitmapRegionDecoderCompat , версию API 8+ стандартного BitmapRegionDecoder (API 10+).

Особенности

  • Он работает в режиме «compat» на устройствах с API <10, используя базовый резерв Java / Android (что означает, что он не будет столь же эффективным и быстрым, как реализация JNI на основе API 10+, но он избежит уродливых шаблонов и руководства откаты).
  • Он использует встроенную реализацию JNI при работе на API 10+ .
  • Он добавляет дополнительные удобные методы, такие как decodeBestRegion() , который извлекает «наилучшую» субрегион изображения с учетом ваших параметров (плотность, размер). Этот метод также работает с API <10.

Скачать

Чтобы использовать его в своем проекте, вы можете вручную загрузить и добавить библиотеку в виде файла AAR :

Скачать

Или вы можете добавить dependecy в свой build.gradle (требуется репозиторий jCenter ):

 dependencies { //...your dependecies compile 'org.bonnyfone:brdcompat:0.1' } 

Применение

Как указано в документах, для перехода на BRDCompat вам просто нужно изменить имя базового класса с BitmapRegionDecoder на BitmapRegionDecoderCompat :

 //BitmapRegionDecoder brd = BitmapRegionDecoder.newInstance(...); BitmapRegionDecoderCompat brd = BitmapRegionDecoderCompat.newInstance(...);