30

私はSOに関する別の質問への回答を読んでいました。そこでは、@ RomainGuyが、Androidの新しいバージョンから以前のバージョンにコードをバックポートできるとコメントしました(言い換えが間違っている場合は修正してください)。具体的には、Androidバージョン2.3.3(Gingerbread)からバージョン2.2.2(Froyo)へのBitmapRegionDecoderのバックポートコードに興味があります。

新しいバージョンのAndroidから古いバージョンにコードをバックポートするときにベストプラクティス/避けるべきこととして、より一般的に質問したかったのですが、stackoverflowは、私の質問が主観的すぎるとして閉じられる可能性があることを示唆しました。

おそらく、トピックに十分な関心がある場合、この質問はより一般的な質問に「変形」される可能性があります。おそらくコミュニティwikiですか?

いずれにせよ、これがどのように行われるかについての洞察をいただければ幸いです。私のユースケースに固有であるか、より一般的なアドバイスであるかは関係ありません。Javaクラス内からネイティブメソッドを呼び出すと、問題が複雑になりますか(必然的にNDKが関係します)?

この方法でコードをチェリーピックしてバックポートすることが実際に可能(そして合理的)である場合、多くの人がその方法を知ることが非常に役立つと思うでしょう。

4

3 に答える 3

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
    

    クラスは、バックポートする必要のある新しいJavaAPIを使用しません。

  • BitmapRegionDecoder.cppFroyo含まれるヘッダーファイルは、次の2つを除いて存在するヘッダーファイルで構成されます。

    • AutoDecodeCancel.h。使用されている唯一の行:

      AutoDecoderCancel   adc(options, decoder);
      

      このクラスは、SkDecoderインスタンスのライフサイクルを処理します。これは小さなコードであり、バックポートされている可能性があります。

    • SkBitmapRegionDecoder.h

      ファイル名に記載されているように、これはコアコンポーネントです。実際、以前はすべて、その周りの一種のラッパーでした。幸いなことに、外部にあり、新しい依存関係が含まれていないため、skiaライブラリ全体をから取得しGingerbeardてコンパイルできるはずなので、バックポートする必要がない場合があります。Froyo

PS私は実際にはコードを深く掘り下げていなかったので、見落としていることがあれば訂正してください。

アップデート:

必要なソースコードは、ブランチの次のリポジトリにfroyo-releaseありgingerbread-mr4-releaseます。

于 2012-06-02T21:52:02.280 に答える
8

移植先のSDKの上にコードが存在する可能性がある場合は、一部のコードをバックポートできます。

何もバックポートすることはできません。たとえば、カーネル機能をバックポートすることはできませんでした。:)

この場合、それをバックポートする簡単な解決策はありません。この実装は、どちらもネイティブコードであるSkiaとjpegデコーダーの上にあります。そのコードを独自に実装する必要があります。プラットフォームからコードをコピーして貼り付け、JNIを使​​用してコードに貼り付けることもできますが、これはかなりの作業量になり、維持する必要のあるネイティブコードが残ります。

申し訳ありませんが、これに対する簡単な解決策はありません。

于 2012-05-31T00:55:22.673 に答える
7

標準のBitmapRegionDecoder(API 10以降)のAPI8以降バージョンであるBitmapRegionDecoderCompatを検討する必要があります。

特徴

  • 基本的なJava/Androidフォールバックを使用してAPI<10を実行しているデバイスで「互換性」モードで動作します(つまり、API 10+のネイティブJNI実装ほど効率的/高速ではありませんが、醜いボイラープレートと手動を回避しますフォールバック)。
  • API 10以降で実行する場合は、ネイティブJNI実装を使用します
  • 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(...);
于 2015-07-20T17:47:45.787 に答える