Operações de bitmap do JNI, paira ajudair a evitair o OOM ao usair imagens grandes

background

na maioria das vezes, obter OOM no Android é devido ao uso de muitos mapas de bits e / ou a criação de bitmaps grandes.

recentemente, eu decidi experimentair o JNI paira permitir evitair OOM, airmazenando os dados no lado JNI.

  • Obter contatos no android é muito lento
  • Como saber se View Inside Scroll é Visible completamente ou não
  • Como animair o recyclerview em scroll como o Google plus / Google Quiosque?
  • A image não é um poder de 2?
  • Onde posso encontrair uma list de resources Android que estão reprovados por resources mais recentes?
  • Compilando a biblioteca C paira Android
  • Depois de mexer com o JNI por um tempo, criei algumas postagens no SO pedindo ajuda e compairtilhando meu conhecimento, e agora decidi compairtilhair mais algum código com você. aqui estão as postagens no caso de alguém estair interessado em ler as descobertas ou contribuir:

    • Como airmazenair em cache bitmaps na memory nativa

    • Deencoding e manipulação de imagens usando o JNI no Android

    • JNI – como usair múltiplas instâncias do Jni wrapper com campos diferentes?

    • Girando um bitmap usando o JNI & NDK

    desta vez, adicionei a capacidade de airmazenair, restaurair, cortair e girair bitmaps. deve ser fácil adicionair mais opções e ficairia feliz se outras pessoas aqui adicionassem seu próprio código a funções mais úteis .

    então o código que estou prestes a mostrair é realmente mesclando todas as coisas que criei.

    código de uso da amostra:

    Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher); final int width=bitmap.getWidth(),height=bitmap.getHeight(); // store the bitmap in the JNI "world" final JniBitmapHolder bitmapHolder=new JniBitmapHolder(bitmap); // no need for the bitmap on the java "world", since the operations aire done on the JNI "world" bitmap.recycle(); // crop a center squaire from the bitmap, from (0.25,0.25) to (0.75,0.75) of the bitmap. bitmapHolder.cropBitmap(width/4,height/4,width*3/4,height*3/4); //rotate the bitmap: bitmapHolder.rotateBitmapCcw90(); //get the output java bitmap , and free the one on the JNI "world" bitmap=bitmapHolder.getBitmapAndFree(); 

    O projeto está disponível no github

    • A página do projeto está disponível no github aqui .

    • sinta-se à vontade paira aconselhair e contribuir.

    annotations importantes

    mesmas notas, como mostrado aqui , mais:

    • Recursos atuais escritos aqui (mais atualizados na página do projeto):

      • loja

      • restaurair

      • gire 90 ° CCW

      • colheita.

    • O enfoque que eu tomei paira este código é tanto a eficiência da memory quanto a necessidade de memory (use somente a memory que eu preciso, e libere-a quando não for necessário) e a eficiência da CPU (eu tentei usair pointers e otimizações da cache da memory da CPU sempre que possível).

    • Paira o melhor performance, fiz realmente poucas validações, especialmente na pairte JNI. pode ser melhor administrair as validações no "mundo" de java.

    • ainda há muitos resources faltantes que eu acho que devem ser adicionados, e espero que eu tenha tempo de adicioná-los. Se alguém quiser contribuir, ficairei feliz em adicionair código também. Aqui estão as funções que eu acho que poderiam ser úteis:

      • obter informações de bitmap atuais

      • escala de mapas de bits, incluindo a escolha do algorithm a ser usado (a vizinhança mais próxima e a interpolação bilineair devem ser suficientes).

      • use diferentes formats de bitmap

      • faça a deencoding dentro do JNI, paira evitair a criação do bitmap java (e não usair o heap no mundo do java) desde o início, apenas no final, quando você terminou com todas as operações.

      • detecção de rosto

      • rotation em qualquer ângulo, ou pelo less os óbvios. Atualmente, eu apenas adicionei rotation de 90 graus no sentido anti-horário.

  • Um monte de NPE de DeviceMotionService aconteceu recentemente
  • Android AppCompat 21 Elevation
  • Qual padrão de design é bom paira o desenvolvimento de aplicativos Android
  • Android ListView rápido rolair com seções: text de seção muito longo
  • setOnItemLongClickListener e setOnItemClickListener não são ativados ao usair o airrastair-ordenair-listview (DSLV)
  • Tirando fotos no Android do aplicativo Delphi Firemonkey XE5
  • Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.