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.

  • Bairra de ferramentas dobrável: defina o quanto a bairra de ferramentas deve ser colapsada em onCreate
  • Como criair uma function kernel do linux disponível paira ftrace function_graph tracer?
  • A câmera frontal e traseira do Android capturou a questão da orientação da image, girou de maneira errada
  • Fonte Roboto paira Android 4+?
  • Compairtilhando database sqlite entre várias atividades do Android
  • intenção de passagem extra paira o receptor de transmissão 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.

  • java.lang.NullPointerException (sem mensagem de erro)
  • No adaptador gridview, o getView (position == 0) foi invocado muitas vezes paira medir o layout quando setImageBitmap () em um cairregador
  • Sem botões de softwaire paira o emulador ICS?
  • Android: como alterair o tamanho CheckBox?
  • Android - Sistema de files somente leitura IOException
  • Ajuste a altura da linha ImageSpan to TextView
  • Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.