libjpeg-turbo para android
android-ndk (4)
Necesito libjpeg-turbo para Android ndk. ¿Alguien logró compilarlo como .a (estático) lib? Lo he intentado varias veces, pero solo me ha dado muchos errores.
Esta respuesta se expande en la respuesta de Alex Cohn. El crédito completo es para él para que comience. Esta respuesta le permitirá construir libjpeg-turbo con ensamblaje para ARM (con o sin NEON), así como x86. También se proporciona compatibilidad con MIPS para que pueda ser un buen ciudadano y construir su aplicación para todas las plataformas que admite la versión r8e del NDK de Android.
Todavía soy un novato en lo relativo a responder preguntas, así que no tengo permisos para incluir archivos adjuntos. Así que voy a tener que insertar un montón de código. También estoy seguro de que hay mejores maneras de hacer fragmentos de lo siguiente, así que estoy abierto a sugerencias para mejorar.
Hacer que todo esto funcione se realizó en seis pasos principales (el paso dos tiene muchos subpasos, cada uno de los cuales se puede encontrar después de los seis pasos principales):
Descargue a través de git la biblioteca libjpeg-turbo que contiene un conjunto de códigos y archivos .mk para Android. Lo descargué desde aquí con git:
git clone git://git.linaro.org/people/tomgall/libjpeg-turbo/libjpeg-turbo.git -b linaro-android
Se debe dar todo el crédito y agradecimiento a Tom Gall por hacer el trabajo inicial.
Descargue YASM (un ensamblador para x86) y configure el entorno de compilación de Android para admitirlo. Vea el conjunto de instrucciones sobre la configuración de YASM para el NDK de Android que estoy incluyendo debajo de la regla horizontal al final de los cambios de mi Android.mk en el paso 6. El soporte de x86 requiere que no tenga miedo de ajustar la instalación del NDK.
Tal vez podría haber usado el compilador NASM, pero estaba lo suficientemente lejos en la ruta YASM antes de investigar NASM que completé la ruta YASM.
Cree el archivo simd / jsmidcfg.inc. La biblioteca libjpeg-turbo proporciona simd / jsmidcfg.inc.h. Está destinado para que el preprocesador tome el .h y lo convierta en un .inc. Estoy seguro de que hay una mejor manera de que suceda que lo que yo hice. Pero no se pudo resolver debido a presiones de tiempo. En su lugar, ejecuté manualmente un gcc que venía con Android para crear el archivo con el siguiente comando:
C:/development/android/ide/android-ndk-r8e-windows-x86_64/toolchains/x86-4.4.3/prebuilt/windows-x86_64/bin/i686-linux-android-gcc.exe -E C:/development/thirdparty/libjpeg-turbo/libjpeg-turbo-android-1.2.0/simd/jsimdcfg.inc.h -o C:/development/thirdparty/libjpeg-turbo/libjpeg-turbo-android1.2.0/simd/jsimdcfg.inc
Una vez que se completó el preprocesador, tuve que editar manualmente el archivo para ponerlo en un estado utilizable. Tuve que seleccionar todas las líneas de arriba "; - jpeglib.h" y eliminarlas.
Luego, tuve que encontrar cada una de las definiciones% que comenzaron con _cpp_protection_ y duplicar cada una de esas definiciones% SIN LA _cpp_protection_. Por ejemplo,
%define _cpp_protection_RGB_RED 0
convirtió en%define RGB_RED 0
Para ARM, quería que mi código admitiera dinámicamente las instrucciones de NEON en el hardware que lo tenía, y que recurriera a algo más simple en el hardware que no lo hizo, modifiqué simd / jsimd_arm.c para consultar dinámicamente la información. No quería tener que hacer esa elección al construir libjpeg-turbo.
Agregué las siguientes líneas de código:
#ifdef ANDROID #include <cpufeatures/cpu-features.h> #endif
y
#ifdef ANDROID uint64_t cpuFeatures = android_getCpuFeatures(); if (cpuFeatures & ANDROID_CPU_ARM_FEATURE_NEON) { simd_support |= JSIMD_ARM_NEON; } #endif
dentro del método init_simd ()
Habilitando MIPS.
Para ser un buen ciudadano, quería habilitar la compilación en MIPS. Si bien no hay ningún código de ensamblador para MIPS, al menos el código debe compilarse y ejecutarse. Para hacer eso, copié simd / jsimd_arm.c a simd / jsimd_mips.c. Edité el archivo para que
init_simd()
configurarasimd_support = 0;
También cambié todos losjsimd_can_*()
para devolver 0. Finalmente,jsimd_can_*()
la implementación de todos los demás métodos.Como me interesaba más que una compilación para ARM, cambié el archivo Application.mk para incluir las siguientes líneas:
APP_ABI := all APP_OPTIM := release
La APP_OPTIM proviene de Cómo optimizar un código nativo con android-ndk (Optimización de la velocidad)
Dentro de Android.mk, comenté todo desde el bloque de comentarios "cjpeg" y más abajo. Para hacer un comentario en bloque, seguí el consejo de Cómo agregar comentarios de varias líneas en makefiles
Luego personalicé el propio archivo Android.mk para poder compilar para todas las CPU compatibles actualmente (ARM, x86, MIPS). Esto es lo que terminé con (código comentado porque quería una biblioteca estática, también para dejar el código original en su lugar para que pueda ver qué ha cambiado). Lo más probable es que tenga que cambiar (o eliminar) las llamadas al método addprefix porque el archivo a continuación está personalizado para mi entorno de construcción. Pero aparte de eso, debería funcionar para ti.
.
##################################################
### simd ###
##################################################
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#ifeq ($(ARCH_ARM_HAVE_NEON),true)
#LOCAL_CFLAGS += -D__ARM_HAVE_NEON
#endif
# From autoconf-generated Makefile
EXTRA_DIST = simd/nasm_lt.sh simd/jcclrmmx.asm simd/jcclrss2.asm simd/jdclrmmx.asm simd/jdclrss2.asm /
simd/jdmrgmmx.asm simd/jdmrgss2.asm simd/jcclrss2-64.asm simd/jdclrss2-64.asm /
simd/jdmrgss2-64.asm simd/CMakeLists.txt
#libsimd_SOURCES_DIST = simd/jsimd_arm_neon.S /
simd/jsimd_arm.c
libsimd_SOURCES_DIST :=
ifeq ($(TARGET_ARCH),arm)
libsimd_SOURCES_DIST := simd/jsimd_arm_neon.S /
simd/jsimd_arm.c
endif
ifeq ($(TARGET_ARCH),x86)
#libsimd_SOURCES_DIST := simd/jsimd_mips.c
# List of assembly files needed is derived from content within simd/CMakelists.txt
# The Intel Atom supports x86 32-bit assembly. So take those files and leave the
# 64-bit behind.
libsimd_SOURCES_DIST := simd/jsimd_i386.c /
simd/jsimdcpu.asm simd/jccolmmx.asm simd/jcgrammx.asm simd/jdcolmmx.asm simd/jcsammmx.asm simd/jdsammmx.asm /
simd/jdmermmx.asm simd/jcqntmmx.asm simd/jfmmxfst.asm simd/jfmmxint.asm simd/jimmxred.asm simd/jimmxint.asm simd/jimmxfst.asm simd/jcqnt3dn.asm /
simd/jf3dnflt.asm simd/ji3dnflt.asm simd/jcqntsse.asm simd/jfsseflt.asm simd/jisseflt.asm simd/jccolss2.asm simd/jcgrass2.asm simd/jdcolss2.asm /
simd/jcsamss2.asm simd/jdsamss2.asm simd/jdmerss2.asm simd/jcqnts2i.asm simd/jfss2fst.asm simd/jfss2int.asm simd/jiss2red.asm simd/jiss2int.asm /
simd/jiss2fst.asm simd/jcqnts2f.asm simd/jiss2flt.asm
endif
ifeq ($(TARGET_ARCH),mips)
libsimd_SOURCES_DIST := simd/jsimd_mips.c
endif
#LOCAL_SRC_FILES := $(libsimd_SOURCES_DIST)
#LOCAL_SRC_FILES := $(addprefix ../../libjpeg-turbo-android-1.2.0/,$(LOCAL_SRC_FILES))
LOCAL_C_INCLUDES := $(LOCAL_PATH)/simd /
$(LOCAL_PATH)/android
LOCAL_C_INCLUDES := simd android
#LOCAL_C_INCLUDES := $(addprefix ../../libjpeg-turbo-android-1.2.0/,$(LOCAL_C_INCLUDES))
#AM_CFLAGS := -march=armv7-a -mfpu=neon
#AM_CCASFLAGS := -march=armv7-a -mfpu=neon
#LOCAL_MODULE_TAGS := debug
#LOCAL_MODULE := libsimd
#include $(BUILD_STATIC_LIBRARY)
######################################################
### libjpeg.so ##
######################################################
#include $(CLEAR_VARS)
# From autoconf-generated Makefile
libjpeg_SOURCES_DIST = jcapimin.c jcapistd.c jccoefct.c jccolor.c /
jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c /
jcomapi.c jcparam.c jcphuff.c jcprepct.c jcsample.c jctrans.c /
jdapimin.c jdapistd.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c /
jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c /
jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c /
jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c /
jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c /
jaricom.c jcarith.c jdarith.c /
turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c #/
turbojpeg-mapfile
LOCAL_SRC_FILES:= $(libjpeg_SOURCES_DIST) $(libsimd_SOURCES_DIST)
#LOCAL_SRC_FILES:= $(libjpeg_SOURCES_DIST)
LOCAL_SRC_FILES := $(addprefix ../../../libjpeg-turbo-android-1.2.0/,$(LOCAL_SRC_FILES))
#LOCAL_SHARED_LIBRARIES := libcutils
#LOCAL_STATIC_LIBRARIES := libsimd
#LOCAL_C_INCLUDES := $(LOCAL_PATH)
# Include C:/development/android/ide/android-ndk-r8e-windows-x86_64/sources/android
# instead of the lower-level cpufeatures because of how I had to include
# cpu-features.h. It appears as if there is a naming conflict, so I had to
# change how the file was included to avoid naming conflicts.
LOCAL_C_INCLUDES := $(addprefix ../../../libjpeg-turbo-android-1.2.0/,$(LOCAL_C_INCLUDES)) /
C:/development/thirdparty/libjpeg-turbo/libjpeg-turbo-android-1.2.0 /
C:/development/android/ide/android-ndk-r8e-windows-x86_64/sources/android
#LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES)) ./
#LOCAL_C_INCLUDES := $(addprefix $(LOCAL_PATH),$(LOCAL_C_INCLUDES)) $(LOCAL_PATH)../../../libjpeg-turbo-android-1.2.0/
LOCAL_CFLAGS := -DAVOID_TABLES -O3 -fstrict-aliasing -fprefetch-loop-arrays -DANDROID /
-DANDROID_TILE_BASED_DECODE -DENABLE_ANDROID_NULL_CONVERT
LOCAL_CFLAGS += -DJPEG_LIB_VERSION=80 # I need version 8 because of some of the methods I depend on
LOCAL_YASMFLAGS := -P../../libjpeg-turbo-android-1.2.0/simd/jsimdcfg.inc
#LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_STATIC_LIBRARY)
#LOCAL_MODULE_TAGS := debug
#LOCAL_MODULE := libjpeg
LOCAL_MODULE := jpeg-turbo
#include $(BUILD_SHARED_LIBRARY)
#LOCAL_STATIC_LIBRARIES := cpufeatures
include $(BUILD_STATIC_LIBRARY)
# We reference android/cpufeatures in the Android.mk file of our main app, so
# we don''t need to do anything here.
#$(call import-module,android/cpufeatures)
Parte del código fuente que se envía con libjpeg-turbo está en formato .asm. Es decir, debe compilarse con el ensamblador NASM. A medida que se envía, el Android NDK no tiene soporte para él.
Para obtener soporte de .asm para trabajar con NDK, seguí el resumen que se presenta aquí: http://software.intel.com/en-us/articles/using-yasm-compiler-on-android-ndkbuild
Aquí hay un conjunto de instrucciones más detalladas. Dentro de android-ndk-r8 / build / core, deben ocurrir las siguientes cosas:
build-binary.mk:
all_source_extensions := .c .s .S $(LOCAL_CPP_EXTENSION)
=>all_source_extensions := .c .s .asm .S $(LOCAL_CPP_EXTENSION)
Para mí, lo anterior estaba en la línea 228.
Después de la línea que comienza con: "# Construir los orígenes en archivos de objetos" verá varios bucles foreach. Agregue uno como este (lo agregué en la línea 272):
$(foreach src,$(filter %.asm,$(LOCAL_SRC_FILES)), $(call compile-asm-source,$(src),$(call get-object-name,$(src))))
definiciones.mk:
Cree un nuevo compile-asm-source para que coincida con la nueva entrada que agregamos dentro del nuevo bucle for anterior. También tenemos que agregar una nueva definición dentro del archivo make. Agregué lo siguiente. Es una combinación y simplificación de las diversas reglas utilizadas para crear archivos .c. Necesitamos un conjunto diferente de opciones cuando se usa yasm que requiere estos cambios.
define ev-compile-asm-source _SRC:=$$(LOCAL_PATH)/$(1) _OBJ:=$$(LOCAL_OBJS_DIR)/$(2) _FLAGS := -f elf -DELF -DPIC $$(LOCAL_YASMFLAGS) _TEXT := "Compile $$(call get-src-file-text,$1)" _CC := $$(NDK_CCACHE) $$(TARGET_ASM) $$(_OBJ): PRIVATE_SRC := $$(_SRC) $$(_OBJ): PRIVATE_OBJ := $$(_OBJ) $$(_OBJ): PRIVATE_DEPS := $$(call host-path,$$(_OBJ).d) $$(_OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE) $$(_OBJ): PRIVATE_TEXT := "$$(_TEXT)" $$(_OBJ): PRIVATE_CC := $$(_CC) $$(_OBJ): PRIVATE_CFLAGS := $$(_FLAGS) ifeq ($$(LOCAL_SHORT_COMMANDS),true) _OPTIONS_LISTFILE := $$(_OBJ).cflags $$(_OBJ): $$(call generate-list-file,$$(_FLAGS),$$(_OPTIONS_LISTFILE)) $$(_OBJ): PRIVATE_CFLAGS := @$$(call host-path,$$(_OPTIONS_LISTFILE)) $$(_OBJ): $$(_OPTIONS_LISTFILE) endif $$(call generate-file-dir,$$(_OBJ)) $$(_OBJ): $$(_SRC) $$(LOCAL_MAKEFILE) $$(NDK_APP_APPLICATION_MK) $$(NDK_DEPENDENCIES_CONVERTER) @$$(HOST_ECHO) "$$(PRIVATE_TEXT) : $$(PRIVATE_MODULE) <= $$(notdir $$(PRIVATE_SRC))" $$(hide) $$(PRIVATE_CC) $$(PRIVATE_CFLAGS) $$(call host-path,$$(PRIVATE_SRC)) -o $$(call host-path,$$(PRIVATE_OBJ)) / $$(call cmd-convert-deps,$$(PRIVATE_DEPS)) endef compile-asm-source = $(eval $(call ev-compile-asm-source,$1,$2))
Busque la línea que comienza con ''compile-s-source''. Lo encontré en la línea 1491. El nuevo compile-asm-source puede ir justo debajo de eso.
A continuación, busque la línea que comienza con "get-object-name". Lo encontré en la línea 1270. Agregue ".asm" al bucle interno interno. Póngalo junto con el .c, .s, y .S
import-locals.mk:
Agregue la siguiente línea debajo de LOCAL_CFLAGS y la línea LOCAL_CPPFLAGS
LOCAL_YASMFLAGS := $(LOCAL_CFLAGS) $(strip $(LOCAL_YASMFLAGS))
default-build-commands.mk:
Agregue la siguiente línea en cualquier parte del archivo. Puse el mío en la sección TARGET_CXX y encima de la sección TARGET_LD.
TARGET_ASM = $(TOOLCHAIN_PREFIX)yasm
Descargue y copie yasm.exe a las carpetas de compilación:
Descargue una copia de YASM desde aquí: http://yasm.tortall.net/
Tengo la versión Win64 del NDK, así que descargué la versión Win64 de YASM. Si tiene la versión Win32 de NDS, descargue la versión Win32 de YASM.
Solo debes obtener el archivo .exe. Cópialo en los siguientes directorios como yasm.exe. Si tiene alguna otra versión de la cadena de herramientas, cópiela también en esos directorios:
C:/development/android/ide/android-ndk-r8e-windows-x86_64/toolchains/x86-4.4.3/prebuilt/windows-x86_64/i686-linux-android/bin C:/development/android/ide/android-ndk-r8e-windows-x86_64/toolchains/x86-4.6/prebuilt/windows-x86_64/i686-linux-android/bin C:/development/android/ide/android-ndk-r8e-windows-x86_64/toolchains/x86-4.7/prebuilt/windows-x86_64/i686-linux-android/bin
Luego, vuelva a copiar el archivo en los directorios a continuación como i686-linux-android-yasm.exe. Y, como se indicó anteriormente, si tiene alguna otra versión de la cadena de herramientas, cópiela también en esos directorios:
C:/development/android/ide/android-ndk-r8e-windows-x86_64/toolchains/x86-4.4.3/prebuilt/windows-x86_64/bin C:/development/android/ide/android-ndk-r8e-windows-x86_64/toolchains/x86-4.6/prebuilt/windows-x86_64/bin C:/development/android/ide/android-ndk-r8e-windows-x86_64/toolchains/x86-4.7/prebuilt/windows-x86_64/bin
Gracias Alex Cohn y respondió Dec por compartir;
Esta respuesta amplía la respuesta de Alex Cohn y la respuesta de Dec;
Estoy usando jpeg turbo 1.3.9, ndk-r9d, sobre yasm.exe, el ndk-r9d está contenido, después de haber respondido el paso 3 de diciembre, tuve un error en la línea simd / jsimdext.inc: 182 "% define EXTN (nombre) _% + nombre; foo () -> _foo "; cámbielo a "% define EXTN (nombre) nombre"; entonces bien, este problema se había solucionado;
este es mi Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS += -D__ARM_HAVE_NEON
#ifeq ($(ARCH_ARM_HAVE_NEON),true)
#LOCAL_CFLAGS += -D__ARM_HAVE_NEON
#endif
# From autoconf-generated Makefile
EXTRA_DIST = nasm_lt.sh CMakeLists.txt /
jccolext-mmx.asm jcgryext-mmx.asm jdcolext-mmx.asm jdmrgext-mmx.asm /
jccolext-sse2.asm jcgryext-sse2.asm jdcolext-sse2.asm jdmrgext-sse2.asm /
jccolext-sse2-64.asm jcgryext-sse2-64.asm jdcolext-sse2-64.asm /
jdmrgext-sse2-64.asm
ifeq ($(TARGET_ARCH),arm)
libsimd_SOURCES_DIST := simd/jsimd_arm_neon.S /
simd/jsimd_arm.c
AM_CFLAGS := -march=armv7-a -mfpu=neon
AM_CCASFLAGS := -march=armv7-a -mfpu=neon
endif
ifeq ($(TARGET_ARCH),x86)
# List of assembly files needed is derived from content within simd/CMakelists.txt
# The Intel Atom supports x86 32-bit assembly. So take those files and leave the
# 64-bit behind.
#libsimd_SOURCES_DIST := simd/jsimd_i386.c /
simd/jsimdcpu.asm /
simd/jfdctflt-3dn.asm /
simd/jidctflt-3dn.asm /
simd/jquant-3dn.asm /
simd/jccolor-mmx.asm /
simd/jcgray-mmx.asm /
simd/jcsample-mmx.asm /
simd/jdcolor-mmx.asm /
simd/jdmerge-mmx.asm /
simd/jdsample-mmx.asm /
simd/jfdctfst-mmx.asm /
simd/jfdctint-mmx.asm /
simd/jidctfst-mmx.asm /
simd/jidctint-mmx.asm /
simd/jidctred-mmx.asm /
simd/jquant-mmx.asm /
simd/jfdctflt-sse.asm /
simd/jidctflt-sse.asm /
simd/jquant-sse.asm /
simd/jccolor-sse2.asm /
simd/jcgray-sse2.asm /
simd/jcsample-sse2.asm /
simd/jdcolor-sse2.asm /
simd/jdmerge-sse2.asm /
simd/jdsample-sse2.asm /
simd/jfdctfst-sse2.asm /
simd/jfdctint-sse2.asm /
simd/jidctflt-sse2.asm /
simd/jidctfst-sse2.asm /
simd/jidctint-sse2.asm /
simd/jidctred-sse2.asm /
simd/jquantf-sse2.asm /
simd/jquanti-sse2.asm
libsimd_SOURCES_DIST := simd/jsimd_i386.c simd/jsimd.h simd/jsimdcfg.inc.h simd/jsimdext.inc /
simd/jcolsamp.inc simd/jdct.inc simd/jsimdcpu.asm /
simd/jfdctflt-3dn.asm simd/jidctflt-3dn.asm simd/jquant-3dn.asm /
simd/jccolor-mmx.asm simd/jcgray-mmx.asm simd/jcsample-mmx.asm /
simd/jdcolor-mmx.asm simd/jdmerge-mmx.asm simd/jdsample-mmx.asm /
simd/jfdctfst-mmx.asm simd/jfdctint-mmx.asm simd/jidctfst-mmx.asm /
simd/jidctint-mmx.asm simd/jidctred-mmx.asm simd/jquant-mmx.asm /
simd/jfdctflt-sse.asm simd/jidctflt-sse.asm simd/jquant-sse.asm /
simd/jccolor-sse2.asm simd/jcgray-sse2.asm simd/jcsample-sse2.asm /
simd/jdcolor-sse2.asm simd/jdmerge-sse2.asm simd/jdsample-sse2.asm /
simd/jfdctfst-sse2.asm simd/jfdctint-sse2.asm simd/jidctflt-sse2.asm /
simd/jidctfst-sse2.asm simd/jidctint-sse2.asm simd/jidctred-sse2.asm /
simd/jquantf-sse2.asm simd/jquanti-sse2.asm
endif
ifeq ($(TARGET_ARCH),mips)
libsimd_SOURCES_DIST := simd/jsimd_mips.c
endif
LOCAL_C_INCLUDES := $(LOCAL_PATH)/simd /
$(LOCAL_PATH)/android
LOCAL_SRC_FILES:= $(libsimd_SOURCES_DIST)
LOCAL_CFLAGS := -DAVOID_TABLES -O3 -fstrict-aliasing -fprefetch-loop-arrays -DANDROID /
-DANDROID_TILE_BASED_DECODE -DENABLE_ANDROID_NULL_CONVERT
LOCAL_CFLAGS += -DJPEG_LIB_VERSION=80 # I need version 8 because of some of the methods I depend on
$(warning "libsimd")
LOCAL_MODULE := libsimd
LOCAL_MODULE_FILENAME := libsimd
include $(BUILD_STATIC_LIBRARY)
######################################################
### libjpeg.so ##
######################################################
#include $(CLEAR_VARS)
# From autoconf-generated Makefile
libjpeg_SOURCES_DIST = jcapimin.c jcapistd.c jccoefct.c jccolor.c /
jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c /
jcomapi.c jcparam.c jcphuff.c jcprepct.c jcsample.c jctrans.c /
jdapimin.c jdapistd.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c /
jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c /
jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c /
jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c /
jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c /
jaricom.c jcarith.c jdarith.c /
turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c /
turbojpeg-mapfile
LOCAL_SRC_FILES:= $(libjpeg_SOURCES_DIST)
LOCAL_SHARED_LIBRARIES += libcutils
LOCAL_STATIC_LIBRARIES += libsimd
LOCAL_C_INCLUDES := $(LOCAL_PATH)
$(warning "libjpeg")
LOCAL_CFLAGS := -DAVOID_TABLES -O3 -fstrict-aliasing -fprefetch-loop-arrays -DANDROID /
-DANDROID_TILE_BASED_DECODE -DENABLE_ANDROID_NULL_CONVERT
LOCAL_CFLAGS += -DJPEG_LIB_VERSION=80 # I need version 8 because of some of the methods I depend on
#D:/android-ndk-r9d/toolchains/x86-4.8/prebuilt/windows-x86_64/bin/i686-linux-android-gcc.exe -E D:/WORKSPACE/MINE/libjpeg_turbo_1.3.9_multi_platform/jni/simd/jsimdcfg.inc.h -o D:/WORKSPACE/MINE/libjpeg_turbo_1.3.9_multi_platform/jni/simd/jsimdcfg.inc
LOCAL_MODULE := libjpeg
LOCAL_MODULE_FILENAME:=libjpeg
LOCAL_STATIC_LIBRARIES += cpufeatures
include $(BUILD_STATIC_LIBRARY)
Para cualquiera que intente construir la versión oficial de recompra, tuve éxito al usar el parche que se adjunta aquí: la compilación cruzada de libjpeg-turbo para Android falla .
Luego, dependiendo de si está compilando para 32 bits o 64 bits:
export CFLAGS="-DSIZEOF_SIZE_T=4"
o
export CFLAGS="-DSIZEOF_SIZE_T=4"
Y ejecute cmake con -DWITH_SIMD = FALSE -DCMAKE_TOOLCHAIN_FILE = your_toolchain_file .
Por supuesto, soy consciente de que deshabilitar SIMD no es lo ideal, pero al menos conseguí una versión que puedo comenzar a usar. Con suerte, el soporte NEON SIMD del sistema de construcción se solucionará en el futuro. El uso de ./configure también falló al generar el SIMD correcto para ARM.
Por cierto, me gustaría que la gente contribuyera con arreglos al repositorio principal, en lugar de simplemente forjarlo. Han pasado 2 años desde el último cambio al repositorio citado en la respuesta de alex-cohn.
Instalar Android NDK . Las siguientes instrucciones fueron verificadas con r8b , las versiones anteriores pueden tener problemas, no lo sé.
Obtén las fuentes de Android para wiki.linaro.org/BenjaminGaignard/libjpeg-turboAndSkia de Benjamin Gaignard:
git clone git://git.linaro.org/people/tomgall/libjpeg-turbo/libjpeg-turbo.git -b linaro-android
En el directorio libjpeg-turbo creado por git , edite el archivo Android.mk : después de la línea 70, LOCAL_MODULE := libjpeg
, agregue lo siguiente:
ifeq ($(notdir $(MAKECMDGOALS)),libjpeg.a)
LOCAL_SRC_FILES += $(libsimd_SOURCES_DIST)
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := dummy
endif
Ejecuta ndk-build :
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk obj/local/armeabi/libjpeg.a
¡Lucro!
PD: Es posible que desee la versión armeabi-v7a :
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=armeabi-v7a obj/local/armeabi-v7a/libjpeg.a
O compile para ARM , para mejorar el rendimiento, agregue a la línea de comandos:
LOCAL_ARM_MODE=arm
Si su objetivo tiene soporte NEON , agregue a la línea de comando:
LOCAL_ARM_NEON=true ARCH_ARM_HAVE_NEON=true
ACTUALIZACIÓN : para que funcione con Android NDK r15 y versiones posteriores, elimine todas las referencias a libcutils
de Android.mk .