如何使用android的2.2.2(升级Froyo)BitmapRegionDecoder代码?(H

2019-06-23 10:38发布

我正在读的答案,不同的问题上如此,这@RomainGuy评论说,人们可以(请纠正我,如果我转述错误)从更高版本的Android的早期版本的后台端口的代码。 具体地讲,我是来自Android版本2.3.3(姜饼)至2.2.2版(升级Froyo),感兴趣的BitmapRegionDecoder背移植代码。

我会宁愿问的问题更普遍的,什么是最好的做法/我应该在Android的旧版本较新的版本时,背移植代码是可以避免的,但计算器暗示,我的问题可能会被封闭,太主观。

也许,如果存在的话题足够的兴趣,这个问题可能是“蜕变”成一个更一般的one..possibly社区维基?

在任何情况下,我将不胜感激任何见解如何,这是done..whether具体到我的使用情况下,以上一般性的建议。 不要从Java类中,以本地方法的调用此事(不一定涉及的NDK)复杂化?

如果这的确是可能的(合理的),以摘樱桃和背部端口的代码以这种方式,我想很多人会觉得要懂得它非常有用。

Answer 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

      作为文件名的状态,这是一个核心组成部分。 事实上,以前所有的都是一种围绕它的包装中。 好消息是,我们可能并不需要备份端口,因为它应该有可能采取整体skia从库Gingerbeard下编译Froyo ,因为它是外部的,不包含任何新的依赖。

PS我没有实际的代码潜入深,所以请纠正我,如果有什么事,我忽略了。

更新:

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

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


Answer 2:

您可以备份端口一些代码,如果它可以在你将它移植到SDK的顶级存在。

不能备份端口什么。 例如,你可以不回口内核功能。 :)

在这种情况下,有没有简单的解决方案来支持,将它移植。 执行这个坐落在Skia的顶部和JPEG解码器,这两者都是本地代码。 你需要做自己的实现代码。 你可以尝试复制/从平台粘贴代码,在用JNI代码粘合,但是这将是工作的一个显著量,让你与你仍然需要继续保持本机代码。

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



Answer 3:

你应该考虑BitmapRegionDecoderCompat ,一个API 8+版标准BitmapRegionDecoder (API 10+)。

特征

  • 工作在设备上的“compat的”模式下使用一个基本的Java / Android的回退(这意味着它不会像高效/快速与天然JNI执行API 10+的运行API <10,但它会避免难看boilerplates和手动回退)。
  • 在API 10+运行时,使用本地JNI实现
  • 它增加了额外的usuful方法,如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(...);


文章来源: How can I use BitmapRegionDecoder code in android 2.2.2 (Froyo)?