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

时间:2012-04-05 20:00:50

标签: java android graphics android-ndk backport

我在SO上正在阅读an answer to a different question,其中@RomainGuy评论说,如果我错误地解释,可以解释我从后续版本的android到早期版本的后端代码。具体来说,我感兴趣的是从Android版本2.3.3(Gingerbread)到版本2.2.2(Froyo)将BitmapRegionDecoder的代码反向移植。

我宁愿更普遍地问这个问题是什么是最佳实践/将代码从较新版本的Android反向移植到旧版本时应该避免什么,但是stackoverflow暗示我的问题可能因为过于主观而被关闭

也许如果对这个主题有足够的兴趣,这个问题可能会“变形”为一个更普遍的问题......可能是一个社区维基?

在任何情况下,我都很感激有关如何做到这一点的任何见解......对我的用例或更一般的建议是否具体。从java类中调用本机方法是否会使问题复杂化(必然涉及NDK)?

如果确实可以(并且合理)以这种方式挑选和后端代码,我想很多人会发现知道如何非常有用。

3 个答案:

答案 0 :(得分:9)

正如@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。它包含的头文件包含Froyo中除了这两个文件之外的文件:

    • AutoDecodeCancel.h。它唯一用于:

      AutoDecoderCancel   adc(options, decoder);
      

      此类处理SkDecoder个实例生命周期。它只是一小段代码,可以很好地反向移植。

    • SkBitmapRegionDecoder.h

      由于文件名声明这是核心组件。事实上,以前所有人都是围绕它的一种包装。好消息是我们可能不需要对它进行反向移植,因为应该可以从skia获取整个Gingerbeard库并在Froyo下编译它,因为它是外部的不包含任何新的依赖项。

P.S。我实际上没有深入研究代码,所以如果有什么我忽略的话,请纠正我。

更新

我们需要的源代码位于分支froyo-releasegingerbread-mr4-release上的以下存储库中:

答案 1 :(得分:8)

如果它可以存在于您要将其移植到的SDK之上,则可以对某些代码进行反向移植。

你无法回传任何东西。例如,您无法反向移植内核功能。 :)

在这种情况下,没有简单的解决方案来反向移植它。这个实现位于Skia和jpeg解码器之上,它们都是本机代码。您需要自己实现该代码。您可以尝试从平台复制/粘贴代码,将其与JNI中的代码粘合在一起,但这将是一项大量工作,并为您留下您需要继续维护的本机代码。

对不起,没有简单的解决办法。

答案 2 :(得分:7)

您应该考虑BitmapRegionDecoderCompat,标准BitmapRegionDecoder API 8 + 版本(API 10 +)。

功能

  • 在" compat"运行API的设备上的模式< 10 使用基本的 Java / Android后备(这意味着它不会像API 10+的本机JNI实现一样高效/快速,但它将避免丑陋的样板和手动回退)。
  • 在API 10 + 上运行时使用本机JNI实现。
  • 它添加了额外的有用方法,例如 decodeBestRegion() , 它提取了最好的"图像子区域给出您的参数(重力,大小)。该方法也适用于API< 10。

下载

要在项目中使用它,您可以手动下载并将库添加为 AAR 文件:

Download

或者您可以在 build.gradle (需要 jCenter 存储库)中添加依赖项:

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

用法

如文档中所述,为了迁移到BRDCompat,您只需将基类名称从BitmapRegionDecoder更改为BitmapRegionDecoderCompat

//BitmapRegionDecoder brd = BitmapRegionDecoder.newInstance(...);
BitmapRegionDecoderCompat brd = BitmapRegionDecoderCompat.newInstance(...);
相关问题