我在SO上正在阅读an answer to a different question,其中@RomainGuy评论说,如果我错误地解释,可以解释我从后续版本的android到早期版本的后端代码。具体来说,我感兴趣的是从Android版本2.3.3(Gingerbread)到版本2.2.2(Froyo)将BitmapRegionDecoder的代码反向移植。
我宁愿更普遍地问这个问题是什么是最佳实践/将代码从较新版本的Android反向移植到旧版本时应该避免什么,但是stackoverflow暗示我的问题可能因为过于主观而被关闭
也许如果对这个主题有足够的兴趣,这个问题可能会“变形”为一个更普遍的问题......可能是一个社区维基?
在任何情况下,我都很感激有关如何做到这一点的任何见解......对我的用例或更一般的建议是否具体。从java类中调用本机方法是否会使问题复杂化(必然涉及NDK)?
如果确实可以(并且合理)以这种方式挑选和后端代码,我想很多人会发现知道如何非常有用。
答案 0 :(得分: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
Class不使用任何我们需要反向移植的新Java API。
BitmapRegionDecoder.cpp
。它包含的头文件包含Froyo
中除了这两个文件之外的文件:
AutoDecodeCancel.h
。它唯一用于:
AutoDecoderCancel adc(options, decoder);
此类处理SkDecoder
个实例生命周期。它只是一小段代码,可以很好地反向移植。
SkBitmapRegionDecoder.h
由于文件名声明这是核心组件。事实上,以前所有人都是围绕它的一种包装。好消息是我们可能不需要对它进行反向移植,因为应该可以从skia
获取整个Gingerbeard
库并在Froyo
下编译它,因为它是外部的不包含任何新的依赖项。
P.S。我实际上没有深入研究代码,所以如果有什么我忽略的话,请纠正我。
我们需要的源代码位于分支froyo-release
和gingerbread-mr4-release
上的以下存储库中:
include/core
和include/images
graphics/java/android/graphics/BitmapRegionDecoder.java
core/jni/android/graphics/...
答案 1 :(得分:8)
如果它可以存在于您要将其移植到的SDK之上,则可以对某些代码进行反向移植。
你无法回传任何东西。例如,您无法反向移植内核功能。 :)
在这种情况下,没有简单的解决方案来反向移植它。这个实现位于Skia和jpeg解码器之上,它们都是本机代码。您需要自己实现该代码。您可以尝试从平台复制/粘贴代码,将其与JNI中的代码粘合在一起,但这将是一项大量工作,并为您留下您需要继续维护的本机代码。
对不起,没有简单的解决办法。
答案 2 :(得分:7)
您应该考虑BitmapRegionDecoderCompat,标准BitmapRegionDecoder的 API 8 + 版本(API 10 +)。
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(...);