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

sna*_*pop 30 java graphics android backport android-ndk

我正在阅读关于SO 的另一个问题的答案,其中@RomainGuy评论说可以(如果我错误地解释,请纠正我)从后续版本的android到早期版本的后端代码.具体来说,我感兴趣的是从Android版本2.3.3(Gingerbread)到版本2.2.2(Froyo)的BitmapRegionDecoder的代码反向移植.

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

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

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

如果以这种方式确实(并且合理)采用樱桃选择和后端口代码,我认为很多人会发现知道如何非常有用.

And*_*kov 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
    
    Run Code Online (Sandbox Code Playgroud)

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

  • BitmapRegionDecoder.cpp.它包含的头文件包含Froyo除以下两个之外的文件:

    • AutoDecodeCancel.h.它唯一用于:

      AutoDecoderCancel   adc(options, decoder);
      
      Run Code Online (Sandbox Code Playgroud)

      此类处理SkDecoder实例生命周期.这是一小段代码,可能会很好地反向移植.

    • SkBitmapRegionDecoder.h

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

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

更新:

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


hac*_*bod 8

您可以对某些代码进行反向移植,如果它可以存在于您将其移植到的SDK之上.

你无法回传任何东西.例如,您无法反向移植内核功能.:)

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

对不起,没有简单的解决方案.


bon*_*nyz 7

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

特征

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

下载

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

下载

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

dependencies {
    //...your dependecies
    compile 'org.bonnyfone:brdcompat:0.1'
}
Run Code Online (Sandbox Code Playgroud)

用法

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

//BitmapRegionDecoder brd = BitmapRegionDecoder.newInstance(...);
BitmapRegionDecoderCompat brd = BitmapRegionDecoderCompat.newInstance(...);
Run Code Online (Sandbox Code Playgroud)