libjpeg-turbo para android

Necesito libjpeg-turbo para Android ndk. ¿Alguien logró comstackrlo como .a (static) lib? Lo intenté varias veces, pero solo me dio muchos errores.

Instala Android NDK . Las siguientes instrucciones fueron verificadas con r8b , las versiones anteriores pueden tener problemas, no lo sé.

Obtenga las fonts de Android para libjpeg-turbo 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 

Ejecute ndk-build :

 ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk obj/local/armeabi/libjpeg.a 

¡Lucro!

PD: Puede que quieras 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 comstackr para ARM , para mejorar el rendimiento, agregar a la línea de comando:

 LOCAL_ARM_MODE=arm 

Si su objective 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 posterior, elimine todas las referencias a libcutils de Android.mk .

Esta respuesta se expande en la respuesta de Alex Cohn. Todo el mérito recae en él por ayudarme a comenzar. Esta respuesta le permitirá construir libjpeg-turbo con ensamblaje para ARM (con o sin NEON) y x86. También se brinda compatibilidad para MIPS para que pueda ser un buen ciudadano y crear su aplicación para todas las plataformas compatibles con la versión r8e de Android NDK.

Sigo siendo relativamente novato en responder preguntas, por lo que no tengo permisos para incluir archivos adjuntos. Así que voy a tener que alinear un montón de código. También estoy seguro de que hay mejores maneras de hacer algunas partes del siguiente, por lo que estoy abierto a sugerencias de mejora.

Hacer todo esto para trabajar se hizo en seis pasos principales (el segundo paso tiene muchos pasos secundarios, cada uno de los cuales se puede encontrar después de los seis pasos principales):

  1. Descargue a través de git la biblioteca libjpeg-turbo que contiene un conjunto de códigos y archivos .mk para Android. Lo descargué de aquí con git:

     git clone git://git.linaro.org/people/tomgall/libjpeg-turbo/libjpeg-turbo.git -b linaro-android 

    Se debe dar crédito completo y agradecimiento a Tom Gall por hacer el trabajo inicial.

  2. Descargue YASM (un ensamblador para x86) y configure el entorno de comstackción de Android para que sea compatible. Consulte el conjunto de instrucciones sobre cómo configurar YASM para Android NDK que incluyo debajo de la regla horizontal al final de mis cambios de Android.mk en el paso 6. El soporte de x86 requiere que no tenga reparos en modificar la instalación de NDK.

    Tal vez podría haber usado el comstackdor NASM, pero estuve lo suficientemente lejos en la ruta YASM antes de investigar NASM como para completar la ruta YASM.

  3. Crea el archivo simd / jsmidcfg.inc. La biblioteca libjpeg-turbo proporciona simd / jsmidcfg.inc.h. Está destinado para que el pre-procesador tome el .h y lo convierta a .inc. Estoy seguro de que hay una mejor manera de que suceda que lo que hice. Pero no pude resolverlo debido a las presiones de tiempo. En cambio, ejecuté manualmente uno de los gcc que venía con Android para crear el archivo usando 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 -EC:\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 

    Después de que el pre-procesador se completó, 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 uno de los% define que comenzó con _cpp_protection_ y duplicar cada uno de esos% define WITHOUT the _cpp_protection_. Por ejemplo, %define _cpp_protection_RGB_RED 0 convirtió en %define RGB_RED 0

  4. Para ARM, quería que mi código admitiera dinámicamente las instrucciones de NEON en el hardware que lo tenía, y recurrir a algo más simple en hardware que no, modifiqué simd / jsimd_arm.c para consultar dinámicamente la información. No quería tener que tomar esa decisión cuando construyo libjpeg-turbo.

    Agregué las siguientes líneas de código:

     #ifdef ANDROID #include  #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 ()

  5. Habilitando MIPS.

    Para ser un buen ciudadano, quería habilitar la comstackción en MIPS. Si bien no hay ningún código de ensamblador para MIPS, el código al menos debería comstackrse y ejecutarse. Para hacer eso, copié simd / jsimd_arm.c a simd / jsimd_mips.c. Edité el archivo para que init_simd() estableciera simd_support = 0; También cambié todos los jsimd_can_*() para devolver 0. Finalmente, jsimd_can_*() la implementación de todos los otros métodos.

  6. Como estaba interesado en algo más que una comstackción para ARM, cambié el archivo Application.mk para incluir las siguientes líneas:

     APP_ABI := all APP_OPTIM := release 

    El APP_OPTIM proviene de Cómo optimizar un código nativo con android-ndk (Optimización de velocidad)

    Dentro de Android.mk, comenté todo desde el bloque de comentarios “cjpeg” y debajo. Para hacer un comentario en bloque, seguí el consejo de Cómo agregar comentarios de múltiples líneas en makefiles

    A continuación, personalicé el archivo Android.mk en sí mismo para poder comstackr para todas las CPU admitidas actualmente (ARM, x86, MIPS). Aquí es a lo que terminé (algunos códigos comentaron porque quería una biblioteca estática, también para dejar el código original en su lugar para que pueda ver qué cambió). Lo más probable es que tenga que cambiar (o eliminar) las llamadas al método addprefix porque el archivo siguiente está personalizado para mi entorno de comstackció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 comstackrse con el ensamblador NASM. A medida que se envía, el NDK de Android no tiene soporte para eso.

Para obtener la compatibilidad con .asm trabajando con NDK, seguí el esquema aproximado presentado 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, las siguientes cosas deben ocurrir:

  1. 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: “# Build the sources to object files”, 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)))) 
  2. definitions.mk:

    Cree un nuevo compile-asm-source para que coincida con la nueva entrada que agregamos dentro del nuevo ciclo for for arriba. También tenemos que agregar una nueva definición dentro del archivo make. Agregué lo siguiente. Es una combinación y simplificación de varias reglas usadas para construir archivos .c. Necesitamos un conjunto diferente de opciones cuando usamos yasm que necesita 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.

    Luego, busque la línea que comienza con "get-object-name". Lo encontré en la línea 1270. Agregue ".asm" al for-loop interno. Colóquelo junto con .c, .s y .S

  3. import-locals.mk:

    Agregue la siguiente línea debajo de la línea LOCAL_CFLAGS y LOCAL_CPPFLAGS

     LOCAL_YASMFLAGS := $(LOCAL_CFLAGS) $(strip $(LOCAL_YASMFLAGS)) 
  4. default-build-commands.mk:

    Agregue la siguiente línea en cualquier lugar del archivo. Puse el mío en la sección TARGET_CXX y arriba de la sección TARGET_LD.

     TARGET_ASM = $(TOOLCHAIN_PREFIX)yasm 
  5. Descargue y copie yasm.exe en las carpetas de comstackció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.

    Deberías obtener el .exe. Cópielo en los siguientes directorios como yasm.exe. Si tiene alguna otra versión de la cadena de herramientas, cópiela a esos directorios también:

     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 

    A continuación, copie el archivo nuevamente en los siguientes directorios como i686-linux-android-yasm.exe. Y como se indicó anteriormente, si tiene alguna otra versión de la cadena de herramientas, cópiela a esos directorios también:

     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 se expande en la respuesta de Alex Cohn y responde la respuesta de Dec;

Estoy usando jpeg turbo 1.3.9, ndk-r9d, sobre yasm.exe, el ndk-r9d está contenido, después de que contestó el paso 3 de Dec, 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 solucionó;

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 -ED:\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 repo, tuve éxito usando el parche adjunto aquí: falla la comstackción cruzada libjpeg-turbo a Android .

Luego, dependiendo de si está comstackndo 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 desactivar SIMD no es ideal, pero al menos logré obtener una comstackción que puedo empezar a usar. Con suerte, el soporte NEON SIMD del sistema de construcción se arreglará en el futuro. El uso de ./configure tampoco logró construir el SIMD correcto para ARM.

A propósito, desearía que la gente contribuyera con las correcciones al repository principal, en lugar de simplemente bifurcarlo. Han pasado 2 años desde el último cambio al repository citado en la respuesta de alex-cohn.