30

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

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

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

无论如何,我都希望能深入了解这是如何完成的……无论是针对我的用例还是更一般的建议。从 java 类中调用本机方法是否会使问题复杂化(必然涉及 NDK)?

如果确实有可能(并且合理)以这种方式挑选和反向移植代码,我认为许多人会发现知道如何做非常有用。

4

3 回答 3

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
    

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

  • BitmapRegionDecoder.cpp. 它包含的头文件包括Froyo除了这两个之外的头文件:

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

      AutoDecoderCancel   adc(options, decoder);
      

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

    • SkBitmapRegionDecoder.h

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

PS我实际上并没有深入研究代码,所以如果我忽略了任何内容,请纠正我。

更新:

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

于 2012-06-02T21:52:02.280 回答
8

如果某些代码可以存在于您要移植到的 SDK 之上,您可以反向移植一些代码。

你不能向后移植任何东西。例如,您不能向后移植内核功能。:)

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

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

于 2012-05-31T00:55:22.673 回答
7

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

特征

  • 在运行 API < 10 的设备上使用基本的 Java/Android 后备以“兼容”模式运行(这意味着它不会像 API 10+ 的本机 JNI 实现那样高效/快速,但它会避免丑陋的样板和手动后备)。
  • 在 API 10+ 上运行时使用本机 JNI 实现
  • 它添加了额外的常用方法,例如decodeBestRegion(),根据您的参数(重力、大小)提取“最佳”图像子区域。此方法也适用于 API < 10。

下载

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

下载

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

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

用法

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

//BitmapRegionDecoder brd = BitmapRegionDecoder.newInstance(...);
BitmapRegionDecoderCompat brd = BitmapRegionDecoderCompat.newInstance(...);
于 2015-07-20T17:47:45.787 回答