当前位置: 首页 > 面试题库 >

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

上官恩
2023-03-14
问题内容

我正在阅读一个关于SO的不同问题的答案,一个人可以(如果我的说法不正确,请更正我)将端口代码从更高版本的android移植到早期版本。具体来说,我对将BitmapRegionDecoder的代码从Android版本2.3.3(Gingerbread)反向移植到版本2.2.2(Froyo)感兴趣。

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

也许如果对该主题有足够的兴趣,可以将此问题“变形”为更一般的问题。可能是社区Wiki?

无论如何,无论您是针对我的用例,还是更一般的建议,我都希望对如何做到这一点有任何见解。从Java类内部对本地方法的调用会使问题复杂化(必然涉及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`

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

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

更新:

我们需要的源代码位于分支机构froyo-release和上的以下存储库中gingerbread-mr4-release

  • 外部Skia库存储库
    • 头文件在include/coreinclude/images
  • Android框架基础
    • Java代码: graphics/java/android/graphics/BitmapRegionDecoder.java
    • 本机代码: core/jni/android/graphics/...


 类似资料:
  • 问题内容: 我需要编写一个代码来比较Java 和Scala的性能。我很难在我的Java代码中使用Scala 。有人可以发布一个真正简单的“ hello world”示例,该示例如何使用Java代码(在文件中)创建Scala 并在其中添加100个随机数吗? PS:我非常擅长Java,但从未使用过Scala。 问题答案: 与其他方式相比,在Scala中使用Java集合要容易得多,但是由于您提出了以下要

  • 我正在编写一个教会应用程序,其中我正在使用本教程使用可滑动的选项卡 但我希望我的应用程序支持Froyo及以上! AndroidManifest.xml

  • **这是我要在旧代码中插入的新项目**<?xml 版本=“1.0”encoding=“UTF-8”?> **插入旧代码时显示v7小部件错误**<?xml 版本=“1.0”编码=“UTF-8”?>

  • 问题内容: 在Java代码的标签中使用break语句时出现错误。这正在显示。编写这样的代码是错误的。请协助我正确使用它。提前致谢。 问题答案: 带标签的A 与声明不同。Java没有声明。 标签标记了其后的语句。您可以使用它来突破该语句,并且只能脱离该语句。流的控制权将始终转移到标记语句的末尾。 那你这里有什么? 由于if后的分号,实际上这是整个标记的语句。因此,您根本不在其范围内。如果您没有该分号

  • 问题内容: 我有一个处理图像的Matlab代码。我想创建一个使用该代码的Hadoop映射器。我遇到了以下解决方案,但不确定哪种解决方案最好(对我而言,很难在hadoop中的每个从属节点上安装matlab编译器运行时): 手动将Matlab代码转换为C ++中的OpenCV,然后从映射器中调用其exe / dll(并为其提供适当的参数)。不确定,因为群集在每个节点上都安装了Linux,而不是Wind

  • 我想使用ArchUnit来强制使用SLF4J日志框架,避免使用简单的系统。out调用。此外,我希望避免使用任何其他日志框架。我该如何实施此类检查? 目前我写了这个测试 但它实际上并没有强制SLF4J的使用,只是限制的使用,并防止依赖于类(实际上常量所在的位置)。 是否是我的案例更优雅的解决方案?