我正在读的答案,不同的问题上如此,这@RomainGuy评论说,人们可以(请纠正我,如果我转述错误)从更高版本的Android的早期版本的后台端口的代码。 具体地讲,我是来自Android版本2.3.3(姜饼)至2.2.2版(升级Froyo),感兴趣的BitmapRegionDecoder背移植代码。
我会宁愿问的问题更普遍的,什么是最好的做法/我应该在Android的旧版本较新的版本时,背移植代码是可以避免的,但计算器暗示,我的问题可能会被封闭,太主观。
也许,如果存在的话题足够的兴趣,这个问题可能是“蜕变”成一个更一般的one..possibly社区维基?
在任何情况下,我将不胜感激任何见解如何,这是done..whether具体到我的使用情况下,以上一般性的建议。 不要从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/core
和include/images
- Android框架的基础
- Java代码:
graphics/java/android/graphics/BitmapRegionDecoder.java
- 本机代码:
core/jni/android/graphics/...
您可以备份端口一些代码,如果它可以在你将它移植到SDK的顶级存在。
不能备份端口什么。 例如,你可以不回口内核功能。 :)
在这种情况下,有没有简单的解决方案来支持,将它移植。 执行这个坐落在Skia的顶部和JPEG解码器,这两者都是本地代码。 你需要做自己的实现代码。 你可以尝试复制/从平台粘贴代码,在用JNI代码粘合,但是这将是工作的一个显著量,让你与你仍然需要继续保持本机代码。
很抱歉,对此没有简单的解决方案。
你应该考虑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你只需要基类的名字从改变BitmapRegionDecoder
到BitmapRegionDecoderCompat
:
//BitmapRegionDecoder brd = BitmapRegionDecoder.newInstance(...);
BitmapRegionDecoderCompat brd = BitmapRegionDecoderCompat.newInstance(...);