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

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

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

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

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

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

3 ответа

Решение

Как упомянул @hackbod 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

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

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

Обновить:

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

Вы можете создать бэкпорт некоторого кода, если он может существовать поверх 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:

https://bintray.com/bonnyfone/maven/org.bonnyfone.brdcompat/_latestVersion

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

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

использование

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

//BitmapRegionDecoder brd = BitmapRegionDecoder.newInstance(...);
BitmapRegionDecoderCompat brd = BitmapRegionDecoderCompat.newInstance(...);
Другие вопросы по тегам