30 votes

Comment puis-je utiliser le code BitmapRegionDecoder dans Android 2.2.2 (Froyo)?

J'ai lu une réponse à une question différente , et dans laquelle @RomainGuy a commenté que l'on pourrait (s'il vous plaît corrigez-moi si je suis la paraphrase de manière incorrecte) de l'arrière-port de code à partir des versions ultérieures d'android pour les versions antérieures. Plus précisément, je m'intéresse à dos-le portage de code pour BitmapRegionDecoder à partir de la version Android 2.3.3 (Gingerbread) pour la version 2.2.2 (Froyo).

J'aurais plutôt posé la question de façon plus générale que ce qui est la meilleure pratique / ce qui doit être évité lors de portage de code à partir des versions plus récentes d'Android pour les anciennes versions, mais stackoverflow laissé entendre que ma question pourrait être fermé comme étant trop subjective.

Peut-être que si il ya suffisamment d'intérêt dans le sujet, cette question pourrait être "transformé" dans un cadre plus général..éventuellement un wiki de la communauté?

En tout cas, je vous serais reconnaissant de tout aperçu de la façon dont c'est fait..si spécifique à mon cas d'utilisation, ou de plusieurs conseils généraux. Faire des appels à des méthodes indigènes de l'intérieur de la classe java compliquer la chose (impliquant nécessairement le NDK)?

Si il est effectivement possible (et raisonnable) de cherry-pick et à l'arrière-port de code de cette façon, je pense que beaucoup de il serait très utile de savoir comment.

9voto

Andrey Ermakov Points 1531

Comme @hackbod mentionné BitmapRegionDecoder est externe, skia bibliothèque. Pourtant, c'est peut être un avantage.

Examinons source d'origine:

  • BitmapRegionDecoder.java. La plupart définit les wrappers autour des méthodes indigènes:

    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
    

    La classe de ne pas utiliser toute la nouvelle Api Java, nous aurions besoin de créer un backport.

  • BitmapRegionDecoder.cpp. Fichiers d'en-tête, il comprend composé de ceux qui sont présents en Froyo à l'exception de ces deux:

    • AutoDecodeCancel.h. La seule ligne qu'il est utilisé dans:

      AutoDecoderCancel   adc(options, decoder);
      

      Cette classe gère SkDecoder instances du cycle de vie. C'est un petit morceau de code et peut-être bien en arrière-porté.

    • SkBitmapRegionDecoder.h

      Comme le nom du fichier unis c'est un composant de base. En fait, tous les précédents étaient une sorte de wrappers autour d'elle. La bonne nouvelle est que nous n'avons pas besoin de l'arrière-port comme il devrait être possible de prendre un ensemble skia bibliothèque de l' Gingerbeard et le compiler en vertu de l' Froyo comme il est à l'extérieur et ne contiennent pas de nouvelles dépendances.

P. S. je n'ai pas fait de plongée profonde dans le code de sorte s'il vous plaît corrigez-moi si il y a une chose que j'ai négligé.

Mise à jour:

Le code Source, nous avons besoin se trouve dans les dépôts suivants sur les branches, froyo-release et gingerbread-mr4-release:

8voto

hackbod Points 55292

Vous pouvez l'arrière-port de certains de code, si elle peut exister sur le dessus du SDK, vous êtes portage.

Vous ne pouvez pas l'arrière-port de rien. Par exemple, vous ne pouviez pas en arrière-port une fonctionnalité du noyau. :)

Dans ce cas, il n'y a pas de solution facile à dos-portage. La mise en œuvre de ce se trouve sur le dessus de Skia et le décodeur jpeg, qui sont à la fois en code natif. Vous aurez besoin pour faire votre propre mise en œuvre de ce code. Vous pouvez essayer de copier/coller le code de la plate-forme, en train de le coller dans votre code avec JNI, mais ce sera une quantité importante de travail et de vous laisser avec le code natif, vous devez continuer à maintenir.

Désolé il n'y a pas de solution facile pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X