Libjpeg-turbo для Android

Мне нужно libjpeg-turbo для android ndk. Кто-нибудь сумел скомпилировать его как .a(static) lib? Я пробовал несколько раз, но он дал мне много ошибок.

Ответ 1

Установить Android NDK. Следующие инструкции были проверены с помощью r8b, у более старых версий могут быть проблемы, я не знаю.

Получить источники Android для libjpeg-turbo от Benjamin Gaignard:

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

В каталоге libjpeg-turbo, созданном git, отредактируйте файл Android.mk: после строки 70, LOCAL_MODULE := libjpeg, добавьте следующее:

ifeq ($(notdir $(MAKECMDGOALS)),libjpeg.a)
  LOCAL_SRC_FILES +=  $(libsimd_SOURCES_DIST)
  include $(BUILD_STATIC_LIBRARY)
  include $(CLEAR_VARS)
  LOCAL_MODULE := dummy
endif

Запустите ndk-build:

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

Profit!

PS: Вам может понадобиться версия armeabi-v7a:

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

Или скомпилируйте для ARM, чтобы повысить производительность, добавьте в командную строку:

LOCAL_ARM_MODE=arm

Если ваша цель имеет поддержку NEON, добавьте в командную строку:

LOCAL_ARM_NEON=true ARCH_ARM_HAVE_NEON=true

UPDATE: чтобы он работал с Android NDK r15 и более поздними версиями, удалите все ссылки на libcutils из Android.mk.

Ответ 2

Этот ответ расширяется на ответ Алекса Кон. Полный кредит для него за то, что он начал меня. Этот ответ позволит вам построить libjpeg-turbo со сборкой для ARM (с или без NEON), а также с x86. Совместимость также предусмотрена для MIPS, чтобы вы могли стать хорошим гражданином и создать свое приложение для всех платформ, поддерживаемых версией Android NDK версии r8e.

Я по-прежнему относительный новичок, чтобы отвечать на вопросы, поэтому у меня нет прав на включение вложений. Поэтому мне нужно будет добавить кучу кода. Я также уверен, что есть более эффективные способы сделать биты и куски ниже, так что я открыт для предложений по улучшению.

Чтобы все это работало, было выполнено шесть основных шагов (шаг два имеет множество подэтапов, каждый из которых можно найти после шести основных шагов):

  • Загрузите через git библиотеку libjpeg-turbo, содержащую набор кодов и файлов .mk для Android. Я загрузил его здесь с помощью git:

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

    Полный кредит и благодарность должны быть предоставлены Тому Галлу за выполнение первоначальной работы.

  • Загрузите YASM (ассемблер для x86) и настройте среду сборки Android для ее поддержки. См. Набор инструкций по настройке YASM для Android NDK, которые я включаю ниже горизонтального правила в конце моих изменений Android.mk на шаге 6. Поддержка x86 требует, чтобы вы не стеснялись настраивать установку NDK.

    Возможно, я мог использовать компилятор NASM, но был достаточно далеко по пути YASM, прежде чем исследовать NASM, что я довел путь YASM до завершения.

  • Создайте файл simd/jsmidcfg.inc. Библиотека libjpeg-turbo предоставляет simd/jsmidcfg.inc.h. Он предназначен для предварительного процессора, чтобы взять .h и преобразовать его в .inc. Я уверен, что есть лучший способ для этого, чем то, что я сделал. Но он не смог разобрать его из-за временного давления. Вместо этого я вручную запускал один gcc, который поставлялся с Android, чтобы создать файл, используя следующую команду:

    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
    

    После завершения предварительного процессора мне пришлось вручную отредактировать файл, чтобы он попал в полезное состояние. Мне пришлось выбрать все строки выше "; - jpeglib.h" и удалить их.

    Затем мне нужно было найти каждый из%, определяемых с помощью _cpp_protection_, и дублировать каждый из этих% без WITH_pp_protection_. Например, %define _cpp_protection_RGB_RED 0 стал %define RGB_RED 0

  • Для ARM я хотел, чтобы мой код динамически поддерживал инструкции NEON на оборудовании, имевшем его, и чтобы отказаться от чего-то более простого на аппаратном обеспечении, которого нет, я модифицировал simd/jsimd_arm.c для динамического запроса информации, Я не хотел делать этот выбор при создании libjpeg-turbo.

    Я добавил следующие строки кода:

    #ifdef ANDROID
    #include <cpufeatures/cpu-features.h>
    #endif
    

    и

    #ifdef ANDROID
      uint64_t cpuFeatures = android_getCpuFeatures();
      if (cpuFeatures & ANDROID_CPU_ARM_FEATURE_NEON) {
         simd_support |= JSIMD_ARM_NEON;
      }
    #endif
    

    внутри метода init_simd().

  • Включение MIPS.

    Чтобы быть хорошим гражданином, я хотел включить компиляцию в MIPS. Хотя для MIPS не существует кода ассемблера, код должен, по крайней мере, компилироваться и запускаться. Для этого я скопировал simd/jsimd_arm.c в simd/jsimd_mips.c. Я отредактировал файл так, чтобы init_simd() set simd_support = 0; я также изменил все методы jsimd_can_*(), чтобы вернуть 0. Наконец, я удалил реализацию из всех других методов.

  • Поскольку меня интересовало больше, чем просто сборка для ARM, я изменил файл Application.mk, включив следующие строки:

    APP_ABI := all
    APP_OPTIM := release
    

    APP_OPTIM происходит от Как оптимизировать собственный код с помощью android-ndk (Оптимизация скорости)

    В Android.mk я прокомментировал все из блока комментариев "cjpeg" и ниже. Чтобы сделать комментарий блока, я последовал совету Как добавить многострочные комментарии в make файлах

    Затем я настроил сам файл Android.mk, чтобы я мог создавать для всех поддерживаемых в настоящее время процессоров (ARM, x86, MIPS). Вот что я закончил (какой-то код прокомментировал, потому что я хотел статическую библиотеку - также оставить исходный код на месте, чтобы я мог видеть, что изменилось). Скорее всего, вам придется изменить (или удалить) вызовы метода addprefix, потому что файл ниже настроен для моей среды сборки. Но кроме этого, он должен работать для вас.

.

##################################################
###                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)

Некоторый исходный код, поставляемый с libjpeg-turbo, находится в формате .asm. То есть его необходимо скомпилировать с помощью ассемблера NASM. Поскольку он поставляется, Android NDK не поддерживает его.

Чтобы получить поддержку asasm, работающую с NDK, я следовал грубой схеме, представленной здесь: http://software.intel.com/en-us/articles/using-yasm-compiler-on-android-ndkbuild

Вот набор более подробных инструкций. Внутри android-ndk-r8\build\core должны произойти следующие вещи:

  • build-binary.mk:

    all_source_extensions := .c .s .S $(LOCAL_CPP_EXTENSION) = > all_source_extensions := .c .s .asm .S $(LOCAL_CPP_EXTENSION)

    Для меня это было в строке 228.

    После строки, которая начинается с: "# Построить источники для объектных файлов", вы увидите несколько циклов foreach. Добавьте один из них (я добавил его в строке 272):

    $(foreach src,$(filter %.asm,$(LOCAL_SRC_FILES)), $(call compile-asm-source,$(src),$(call get-object-name,$(src))))
    
  • definitions.mk:

    Создайте новый компилятор-asm-source, чтобы он соответствовал новой записи, которую мы добавили в новый цикл for выше. Мы также должны добавить новое определение в файл make. Я добавил следующее. Это комбинация и упрощение различных правил, используемых для создания файлов .c. Нам нужен другой набор опций при использовании ясности, требующих этих изменений.

    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))
    

    Найдите строку, начинающуюся с 'compile-s-source'. Я нашел его на линии 1491. Новый компилятор-asm-источник может идти прямо ниже этого.

    Затем найдите строку, начинающуюся с "get-object-name". Я нашел его на линии 1270. Добавьте ".asm" во внутренний цикл for. Поместите его вместе с .c,.s и .S

  • import-locals.mk:

    Добавьте строку ниже LOCAL_CFLAGS и LOCAL_CPPFLAGS

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

    Добавьте следующую строку в файл. Я поместил мой под раздел TARGET_CXX и над разделом TARGET_LD.

    TARGET_ASM       = $(TOOLCHAIN_PREFIX)yasm
    
  • Загрузите и скопируйте файл yasm.exe в папки сборки:

    Загрузите копию YASM отсюда: http://yasm.tortall.net/

    У меня есть версия N64 для Win64, поэтому загрузилась версия YASM для Win64. Если у вас есть версия N32 для Win32, загрузите версию YASM Win32.

    Вы должны просто получить .exe. Скопируйте его в следующие каталоги как yasm.exe. Если у вас есть другие версии toolchain, скопируйте их в эти каталоги:

    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
    

    Затем скопируйте файл снова в каталоги ниже как i686-linux-android-yasm.exe. И, как указано выше, если у вас есть какие-либо другие версии toolchain, скопируйте их в эти каталоги:

    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
    

Ответ 3

Спасибо Алекс Кон и ответил Дек за долю;

Этот ответ расширяется на ответ Алекса Кон и отвечает на ответ Дек,

Я использую jpeg turbo 1.3.9, ndk-r9d, о yasm.exe, содержится ndk-r9d, после ответа на третий шаг, у меня была одна ошибка в строке simd/jsimdext.inc: 182 "% define EXTN (name) _% + name; foo() → _foo"; измените его на "% define EXTN (имя)"; то хорошо, эта проблема была исправлена;

это мой 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)

Ответ 4

Для тех, кто пытается создать официальную версию репо, мне удалось использовать прилагаемый патч: libjpeg-turbo cross-compile to Android не работает.

Затем, в зависимости от того, компилируете ли вы для 32-разрядной или 64-разрядной версии:

export CFLAGS="-DSIZEOF_SIZE_T=4"

или

export CFLAGS="-DSIZEOF_SIZE_T=4"

И запустите cmake с -DWITH_SIMD = FALSE -DCMAKE_TOOLCHAIN_FILE = ваш_toolchain_file.

Конечно, я знаю, что отключение SIMD не идеально, но по крайней мере мне удалось получить сборку, которую я могу начать использовать. Хотелось бы надеяться, что поддержка архитектуры neon SIMD в будущем будет исправлена. Использование. /configure также не смогло создать правильный SIMD для ARM.

Кстати, я бы хотел, чтобы люди внесли исправления в основное репо, а не просто разветвляли его. Прошло 2 года с момента последнего изменения репо, указанного в ответе alex-cohn.