【问题标题】:How can I use BitmapRegionDecoder code in android 2.2.2 (Froyo)?如何在 android 2.2.2 (Froyo) 中使用 BitmapRegionDecoder 代码?
【发布时间】:2012-04-19 13:56:10
【问题描述】:

我在 SO 上阅读an answer to a different question,其中@RomainGuy 评论说,可以(如果我的解释不正确,请纠正我)将代码从更高版本的 android 反向移植到早期版本。具体来说,我有兴趣将 BitmapRegionDecoder 的代码从 Android 版本 2.3.3 (Gingerbread) 反向移植到版本 2.2.2 (Froyo)。

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

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

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

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

【问题讨论】:

  • 我将根据以下公式提供赏金:赏金 ~ floor(max(upvotes - downvotes, 0) / 10) * 50。换句话说,对于每 50 个代表,我获得的投票这个问题,我悬赏50分。
  • 我意识到我不能为一个问题一次创建多个赏金,所以我将按顺序设置赏金。另外,我刚刚意识到,在授予 50 分赏金之后,该赏金规模不再可用..所以下一个赏金将是 100 分(如果问题获得足够的选票)。根据上面的“公式”,我将继续从这个问题中奖励积分,以奖励在赏金期间提供最有用信息的答案。最终,我将尽我所能在这个问题上“收支平衡”,并将获得的积分捐赠给最佳答案。
  • 如何根据您的公式为 bonnyz 的answer 提供 250 名代表赏金奖励;)
  • @corsair992 好吧,应该是 100。该金额将很快发放(并且可能会在审查/测试解决方案后奖励)。

标签: java android graphics android-ndk backport


【解决方案1】:

正如@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

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

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

更新:

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

【讨论】:

  • 感谢您的乐观!哪个是“权威”的 git 存储库?我想对此进行试验并在此处记录我的结果,以造福他人。
  • 所有代码都可以在github.com/android找到。使用androidxref.com/source 进行搜索也很方便。我也会尝试自己做。
  • 对不起,“菜鸟”问题,但它会在该列表中的哪个存储库下?我应该克隆多个吗?
  • @snapfractalpop 将此信息添加到答案中。您应该克隆两个 repos,然后尝试从 gingerbread 下的 froyo 编译 skia(使用它创建一个 NDK 应用程序)。尽管按照here 的描述克隆所有AOSP 并将您的后端端口添加到其中可能要容易得多。
  • 感谢您提供有用的信息!我给了你绿色支票,所以除非其他人给出更好的答案,否则你明天可能会知道赏金。此外,我仍将根据“公式”授予新的赏金。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我担心它可能涉及本机代码.. git repo 也可以使用本机代码吗?另外,git repo 在哪里?
  • 获取源码的说明在这里:source.android.com/source/index.html
【解决方案3】:

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

特点

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

下载

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

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

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

用法

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

//BitmapRegionDecoder brd = BitmapRegionDecoder.newInstance(...);
BitmapRegionDecoderCompat brd = BitmapRegionDecoderCompat.newInstance(...);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    相关资源
    最近更新 更多