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

2022-09-01 12:13:44

我正在阅读SO上另一个问题的答案,其中@RomainGuy评论说,可以从更高版本的Android向后移植代码到早期版本(如果我解释不正确,请纠正我)。具体来说,我对将BitmapRegionDecoder的代码从Android版本2.3.3(Gingerbread)反向移植到版本2.2.2(Froyo)感兴趣。

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

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

无论如何,我将不胜感激任何关于如何做到这一点的见解。无论是特定于我的用例,还是更一般的建议。从 java 类中调用本机方法是否会使问题复杂化(必然涉及 NDK)?

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


答案 1

如前所述@hackbod基于外部库。然而,这可能是一个好处。BitmapRegionDecoderskia

让我们来看看原始来源:

  • 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
    

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

  • BitmapRegionDecoder.cpp.它所包含的头文件由除以下两个文件之外存在的头文件组成:Froyo

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

      AutoDecoderCancel   adc(options, decoder);
      

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

    • SkBitmapRegionDecoder.h

      正如文件名所述,这是一个核心组件。事实上,以前所有的都是围绕着它的一种包装。好消息是,我们可能不需要向后移植它,因为应该可以从 中获取整个库并编译它,因为它是外部的,不包含任何新的依赖项。skiaGingerbeardFroyo

附言:我实际上并没有深入研究代码,所以如果我忽略了什么,请纠正我。

更新:

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


答案 2

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

您无法向后移植任何内容。例如,您无法向后移植内核功能。:)

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

很抱歉,没有简单的解决方案。


推荐