Usa libwebp con NDK. libwebp-0.1.3 ya viene con el archivo Android.mk (obsoleto y con errores de sintaxis, pero aún así). También obtuvo enlaces JNI generados en el directorio /swig/
.
Así es como lo tengo trabajo:
- Descargar NDK, lo puso en el sistema
PATH
.
- descarga libwebp-0.1.3.tar.gz, colocarlo en
your_project_dir/jni
- Reemplazar
Android.mk
con la de abajo.
- Crea
jni/src/libwebp_java_wrap.c
con contenido de abajo.
- crear
jni/Application.mk
, con contenido desde abajo.
- ejecuta
ndk-build
desde el directorio del proyecto. Esto genera .so
archivos en /libs/
. Puede inspeccionarlos con nm -D libs/armeabi/libwebp.so
. En la lista verá tanto las funciones de biblioteca nativa (como WebPDecodeRGB
) y sus homólogos JNI (como Java_com_google_webp_libwebpJNI_WebPDecodeRGB
)
- Añadir
/jni/swig/libwebp.jar
para construir camino de su proyecto Android
- Véase más adelante, por ejemplo, cómo usarlo en código Java
Contenido para Android.mk. Se modificó desde el original: se eliminaron los bits del codificador ya que no los necesito, se agregó libwebp_java_wrap.c
, se cambió include $(BUILD_STATIC_LIBRARY)
a include $(BUILD_SHARED_LIBRARY)
.
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
src/dec/alpha.c \
src/dec/frame.c \
src/dec/idec.c \
src/dec/layer.c \
src/dec/quant.c \
src/dec/tree.c \
src/dec/vp8.c \
src/dec/webp.c \
src/dec/io.c \
src/dec/buffer.c \
src/dsp/yuv.c \
src/dsp/upsampling.c \
src/dsp/cpu.c \
src/dsp/dec.c \
src/dsp/dec_neon.c \
src/dsp/enc.c \
src/utils/bit_reader.c \
src/utils/bit_writer.c \
src/utils/thread.c \
src/libwebp_java_wrap.c \
LOCAL_CFLAGS := -Wall -DANDROID -DHAVE_MALLOC_H -DHAVE_PTHREAD -DWEBP_USE_THREAD \
-finline-functions -frename-registers -ffast-math \
-s -fomit-frame-pointer -Isrc/webp
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
LOCAL_MODULE:= webp
include $(BUILD_SHARED_LIBRARY)
contenido de libwebp_java_wrap.c es here, es básicamente el mismo que el archivo tar incluido en libwebp, excepto los bits del codificador retirados.
contenido de Application.mk:
# The ARMv7 is significanly faster due to the use of the hardware FPU
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-9
Aquí es cómo utilizar en código Java. Observe cómo convierte byte [] array a int [] color array - esto se romperá si la endianidad cambia, ¿verdad? También observe cómo utiliza matrices en lugar de números enteros para el ancho y la altura, por lo que se pasan por referencia.
static {
System.loadLibrary("webp");
}
private Bitmap webpToBitmap(byte[] encoded) {
int[] width = new int[] { 0 };
int[] height = new int[] { 0 };
byte[] decoded = libwebp.WebPDecodeARGB(encoded, encoded.length, width, height);
int[] pixels = new int[decoded.length/4];
ByteBuffer.wrap(decoded).asIntBuffer().get(pixels);
return Bitmap.createBitmap(pixels, width[0], height[0], Bitmap.Config.ARGB_8888);
}
cerrada como fuera de tema por las razones completamente trilladas y estúpidos habituales. Esta oficiosidad instintiva matará el desbordamiento de la pila si continúa. – barneypitt
En lates Android studio 2.3+, ahora puede convertir sus imágenes directamente en imágenes web https://developer.android.com/studio/write/convert-webp.html – datBoy