簡體   English   中英

如何在 android 2.2.2 (Froyo) 中使用 BitmapRegionDecoder 代碼?

[英]How can I use BitmapRegionDecoder code in android 2.2.2 (Froyo)?

我正在閱讀關於 SO的另一個問題的答案,其中@RomainGuy 評論說可以(如果我解釋不正確,請糾正我)將代碼從 android 的更高版本反向移植到早期版本。 具體來說,我有興趣將 BitmapRegionDecoder 的代碼從 Android 版本 2.3.3 (Gingerbread) 反向移植到版本 2.2.2 (Froyo)。

我寧願更籠統地問這個問題,因為最佳實踐是什么/當將代碼從 Android 的較新版本反向移植到舊版本時應該避免什么,但 stackoverflow 暗示我的問題可能會因為過於主觀而被關閉。

也許如果對該主題有足夠的興趣,這個問題可以“變形”為更一般的問題..可能是社區維基?

無論如何,如果能深入了解這是如何完成的,我將不勝感激。無論是針對我的用例,還是更一般的建議。 從 java class 內部調用本地方法是否會使事情復雜化(必然涉及 NDK)?

如果確實有可能(並且合理地)以這種方式挑選和向后移植代碼,我想很多人會發現知道如何做非常有用。

正如@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

    Class 不使用我們需要向后移植的任何新的 Java API。

  • BitmapRegionDecoder.cpp 它包含的 Header 個文件由Froyo中存在的文件組成,除了以下兩個:

    • AutoDecodeCancel.h 唯一使用它的行:

       AutoDecoderCancel adc(options, decoder);

      這個 class 處理SkDecoder實例生命周期。 這是一小段代碼,可以很好地向后移植。

    • SkBitmapRegionDecoder.h

      正如文件名所述,這是一個核心組件。 事實上,之前的所有內容都是它的一種包裝。 好消息是我們可能不需要向后移植它,因為它應該可以從Gingerbeard獲取整個skia庫並在Froyo下編譯它,因為它是外部的並且不包含任何新的依賴項。

PS 我實際上並沒有深入研究代碼,所以如果有任何我忽略的地方,請糾正我。

更新:

我們需要的源代碼位於分支 froyo froyo-releasegingerbread-mr4-release的以下存儲庫中:

您可以向后移植一些代碼,如果它可以存在於您要移植到的 SDK 之上。

你不能向后移植任何東西。 例如,您無法向后移植 kernel 功能。 :)

在這種情況下,沒有簡單的解決方案來向后移植它。 它的實現位於 Skia 和 jpeg 解碼器之上,它們都是本機代碼。 您將需要自己執行該代碼。 您可以嘗試從平台復制/粘貼代碼,使用 JNI 將其與您的代碼粘合在一起,但這將是大量工作,並且留給您需要繼續維護的本機代碼。

抱歉,沒有簡單的解決方案。

您應該考慮BitmapRegionDecoderCompat ,它是標准BitmapRegionDecoder (API 10+) 的API 8+版本。

特征

  • 它使用基本的 Java/Android 回退在運行 API < 10 的設備上以“兼容”模式運行(這意味着它不會像 API 10+ 的本機 JNI 實現那樣高效/快速,但它會避免丑陋的樣板和手冊回退)。
  • 在 API 10+ 上運行時使用本機 JNI 實現
  • 它添加了額外的有用方法,如decodeBestRegion() ,它根據您的參數(重力,大小)提取“最佳”圖像子區域。 此方法也適用於 API < 10。

下載

為了在您的項目中使用它,您可以手動下載庫並將其添加為AAR文件:

下載

或者您可以在build.gradle中添加依賴項(需要jCenter存儲庫):

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

用法

如文檔中所述,為了遷移到 BRDCompat,您只需將基本名稱 class 從BitmapRegionDecoderBitmapRegionDecoderCompat

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM