[英]How can I show a preferences screen on older Android devices i.e. Gingerbread and Froyo?
[英]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-release
和gingerbread-mr4-release
的以下存儲庫中:
include/core
和include/images
graphics/java/android/graphics/BitmapRegionDecoder.java
core/jni/android/graphics/...
您可以向后移植一些代碼,如果它可以存在於您要移植到的 SDK 之上。
你不能向后移植任何東西。 例如,您無法向后移植 kernel 功能。 :)
在這種情況下,沒有簡單的解決方案來向后移植它。 它的實現位於 Skia 和 jpeg 解碼器之上,它們都是本機代碼。 您將需要自己執行該代碼。 您可以嘗試從平台復制/粘貼代碼,使用 JNI 將其與您的代碼粘合在一起,但這將是大量工作,並且留給您需要繼續維護的本機代碼。
抱歉,沒有簡單的解決方案。
您應該考慮BitmapRegionDecoderCompat ,它是標准BitmapRegionDecoder (API 10+) 的API 8+版本。
decodeBestRegion()
,它根據您的參數(重力,大小)提取“最佳”圖像子區域。 此方法也適用於 API < 10。為了在您的項目中使用它,您可以手動下載庫並將其添加為AAR文件:
或者您可以在build.gradle中添加依賴項(需要jCenter存儲庫):
dependencies {
//...your dependecies
compile 'org.bonnyfone:brdcompat:0.1'
}
如文檔中所述,為了遷移到 BRDCompat,您只需將基本名稱 class 從BitmapRegionDecoder
為BitmapRegionDecoderCompat
:
//BitmapRegionDecoder brd = BitmapRegionDecoder.newInstance(...);
BitmapRegionDecoderCompat brd = BitmapRegionDecoderCompat.newInstance(...);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.