繁体   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