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

标签 java android graphics android-ndk backport

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

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

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

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

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

  • BitmapRegionDecoder.cpp。它包含的头文件由 Froyo 中存在的头文件组成,除了这两个:

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

      AutoDecoderCancel   adc(options, decoder);
      

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

    • SkBitmapRegionDecoder.h

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

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

更新:

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

关于java - 如何在 android 2.2.2 (Froyo) 中使用 BitmapRegionDecoder 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10035169/

相关文章:

java - 具有依赖关系(外键)的多个 DAO

android - 旋转手机时不显示横向布局

java - 在java中从CSV文件中提取值

android - 在Android Canvas 透明矩形上绘制双色正方形

java - 如何使用 Xuggle 从相机/网络摄像头捕获视频和音频?

java - Saxon 9、Java、来自 doc-available 的 NullPointer

Java - 从 S3 对象逐行读取 (JSON) 数据

android - 在读取或写入 NFC 之前我应该​​征求许可吗?

java - 将 jFrame 输出到 jpeg 或位图

Java 图形字体 - 如何确保字符位于特定区域?